基于Python __dict__与dir()的区别详解


Posted in Python onOctober 30, 2017

Python下一切皆对象,每个对象都有多个属性(attribute),Python对属性有一套统一的管理方案。

__dict__与dir()的区别:

dir()是一个函数,返回的是list;

__dict__是一个字典,键为属性名,值为属性值;

dir()用来寻找一个对象的所有属性,包括__dict__中的属性,__dict__是dir()的子集;

并不是所有对象都拥有__dict__属性。许多内建类型就没有__dict__属性,如list,此时就需要用dir()来列出对象的所有属性。

__dict__属性

__dict__是用来存储对象属性的一个字典,其键为属性名,值为属性的值。

#!/usr/bin/python
# -*- coding: utf-8 -*-
class A(object):
  class_var = 1
  def __init__(self):
    self.name = 'xy'
    self.age = 2

  @property
  def num(self):
    return self.age + 10

  def fun(self):pass
  def static_f():pass
  def class_f(cls):pass

if __name__ == '__main__':#主程序
  a = A()
  print a.__dict__  #{'age': 2, 'name': 'xy'}  实例中的__dict__属性
  print A.__dict__  
  '''
  类A的__dict__属性
  {
  '__dict__': <attribute '__dict__' of 'A' objects>, #这里如果想深究的话查看参考链接5
  '__module__': '__main__',        #所处模块
  'num': <property object>,        #特性对象 
  'class_f': <function class_f>,     #类方法
  'static_f': <function static_f>,    #静态方法
  'class_var': 1, 'fun': <function fun >, #类变量
  '__weakref__': <attribute '__weakref__' of 'A' objects>, 
  '__doc__': None,            #class说明字符串
  '__init__': <function __init__ at 0x0000000003451AC8>}
  '''

  a.level1 = 3
  a.fun = lambda :x
  print a.__dict__ #{'level1': 3, 'age': 2, 'name': 'xy','fun': <function <lambda> at 0x>}
  print A.__dict__ #与上述结果相同

  A.level2 = 4
  print a.__dict__ #{'level1': 3, 'age': 2, 'name': 'xy'}
  print A.__dict__ #增加了level2属性

  print object.__dict__
  '''
  {'__setattr__': <slot wrapper '__setattr__' of 'object' objects>, 
  '__reduce_ex__': <method '__reduce_ex__' of 'object' objects>, 
  '__new__': <built-in method __new__ of type object at>, 
  等.....
  '''

从上述代码可知,

实例的__dict__仅存储与该实例相关的实例属性,

正是因为实例的__dict__属性,每个实例的实例属性才会互不影响。

类的__dict__存储所有实例共享的变量和函数(类属性,方法等),类的__dict__并不包含其父类的属性。

dir()函数

dir()是Python提供的一个API函数,dir()函数会自动寻找一个对象的所有属性(包括从父类中继承的属性)。

一个实例的__dict__属性仅仅是那个实例的实例属性的集合,并不包含该实例的所有有效属性。所以如果想获取一个对象所有有效属性,应使用dir()。

print dir(A)
'''
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'class_f', 'class_var', 'fun', 'level1', 'level2', 'name', 'num', 'static_f']
'''
a_dict = a.__dict__.keys()
A_dict = A.__dict__.keys()
object_dict = object.__dict__.keys()
print a_dict 
print A_dict 
print object_dict 
'''
['fun', 'level1', 'age', 'name']

['__module__', 'level2', 'num', 'static_f', '__dict__', '__weakref__', '__init__', 'class_f', 'class_var', 'fun', '__doc__']

['__setattr__', '__reduce_ex__', '__new__', '__reduce__', '__str__', '__format__', '__getattribute__', '__class__', '__delattr__', '__subclasshook__', '__repr__', '__hash__', '__sizeof__', '__doc__', '__init__']
'''

#因为每个类都有一个__doc__属性,所以需要去重,去重后然后比较
print set(dir(a)) == set(a_dict + A_dict + object_dict) #True

结论

dir()函数会自动寻找一个对象的所有属性,包括__dict__中的属性。

__dict__是dir()的子集,dir()包含__dict__中的属性。

以上这篇基于Python __dict__与dir()的区别详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现的希尔排序算法实例
Jul 01 Python
python实现用户登陆邮件通知的方法
Jul 09 Python
Python字符串和字典相关操作的实例详解
Sep 23 Python
python使用magic模块进行文件类型识别方法
Dec 08 Python
Python爬虫动态ip代理防止被封的方法
Jul 07 Python
python实现几种归一化方法(Normalization Method)
Jul 31 Python
妙用itchat! python实现久坐提醒功能
Nov 25 Python
Pytorch 的损失函数Loss function使用详解
Jan 02 Python
新年福利来一波之Python轻松集齐五福(demo)
Jan 20 Python
python中for in的用法详解
Apr 17 Python
解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题
Jun 23 Python
Python‘==‘ 及 ‘is‘相关原理解析
Sep 05 Python
浅谈使用Python变量时要避免的3个错误
Oct 30 #Python
Python中进程和线程的区别详解
Oct 29 #Python
python logging日志模块的详解
Oct 29 #Python
解决出现Incorrect integer value: '' for column 'id' at row 1的问题
Oct 29 #Python
Python批量更改文件名的实现方法
Oct 29 #Python
python生成二维码的实例详解
Oct 29 #Python
python 读写中文json的实例详解
Oct 29 #Python
You might like
php array_filter除去数组中的空字符元素
2020/06/21 PHP
使用PHP接收POST数据,解析json数据
2013/06/28 PHP
PHP处理SQL脚本文件导入到MySQL的代码实例
2014/03/17 PHP
PHP实现补齐关闭的HTML标签
2016/03/22 PHP
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
PHP Redis扩展无法加载的问题解决方法
2019/08/22 PHP
ThinkPHP5与单元测试PHPUnit使用详解
2020/02/23 PHP
禁止js文件缓存的代码
2010/04/09 Javascript
javascript 隔行换色函数代码
2010/10/24 Javascript
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
2013/01/04 Javascript
JQuery入门——事件切换之hover()方法应用介绍
2013/02/05 Javascript
jquery $(document).ready()和window.onload的区别浅析
2015/02/04 Javascript
javascript限制文本框输入值类型的方法
2015/05/07 Javascript
浅谈javascript构造函数与实例化对象
2015/06/22 Javascript
ES6学习教程之对象的扩展详解
2017/05/02 Javascript
基于webpack 实用配置方法总结
2017/09/28 Javascript
vue.js层叠轮播效果的实例代码
2018/11/08 Javascript
vue cli 3.0 搭建项目的图文教程
2019/05/17 Javascript
微信小程序设置滚动条过程详解
2019/07/25 Javascript
Angular8 实现table表格表头固定效果
2020/01/03 Javascript
[01:32]TI珍贵瞬间系列(一)
2020/08/26 DOTA
Python实现远程调用MetaSploit的方法
2014/08/22 Python
Cpy和Python的效率对比
2015/03/20 Python
python使用matplotlib绘制折线图教程
2017/02/08 Python
对python 通过ssh访问数据库的实例详解
2019/02/19 Python
django中使用事务及接入支付宝支付功能
2019/09/15 Python
pytorch 实现删除tensor中的指定行列
2020/01/13 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
python 统计list中各个元素出现的次数的几种方法
2021/02/20 Python
html5实现移动端适配完美写法
2017/11/16 HTML / CSS
新加坡最佳婴儿用品店:Mamahood.com.sg
2018/08/26 全球购物
关于建议书的格式范文
2014/05/20 职场文书
企业爱岗敬业演讲稿
2014/09/04 职场文书
自愿解除劳动合同协议书
2014/09/11 职场文书
自主招生自荐信怎么写
2015/03/24 职场文书
关于python中readlines函数的参数hint的相关知识总结
2021/06/24 Python