只要是有属性的数据对象 (不一定是面向对象的对象实例, 而是指具有数据类型的数据对象), 都可以通过 - ---- dict 和 dir() 来显示数据对象的相关属性.
dict 可以看作是数据对象的名称空间, 所以只包含自己的属性, 且可以直接增, 删, 改, 查 dict.
dir()可以看作是显示属性的包含显示, 除了显示自己的还显示继承来的属性.
对于模块
参见: 查看模块属性
对于类和对象
以下面的例子解释 dict 和 dir()在应用于类和对象上的不同之处.
- class supcls:
- def hello(self):
- self.data1 = 'hello'
- class childcls(supcls):
- def world(self):
- self.data2 = "world"
在显示内容上
dict 是个 dict 结构, 仅仅只显示完全独属于自己的属性
dir()是一个 list 结构, 除了显示自己的属性, 还显示父类继承而来的属性, 比如从祖先类 object 中继承的属性
下面是 dict 在类属性上显示的结果. 注意, 这里用 keys()只显示数据对象的属性名称, 实际上 dict 中既包含了名称, 也包含了值.
- '''
- 遇到问题没人解答? 小编创建了一个 Python 学习交流 QQ 群:***
- 寻找有志同道合的小伙伴, 互帮互助, 群里还有不错的视频学习教程和 PDF 电子书!
- '''
- >>> childcls.__dict__.keys()
- dict_keys(['__module__', 'world', '__doc__'])
- >>> supcls.__dict__.keys()
- dict_keys(['__module__', 'hello', '__dict__', '__weakref__', '__doc__'])
下面是 dir()显示类属性时候的结果:
- >>> dir(childcls)
- ['__class__', '__delattr__', '__dict__',
- ......
- 'hello', 'world']
- >>> dir(supcls)
- ['__class__', '__delattr__', '__dict__',
- ......
- 'hello']
注意上面 dir(childcls)的结果中含有 hello 属性, 它是来自父类 supcls 的属性. dir()还显示了一大堆的下划线属性, 它们基本上都是继承自祖先类 object 的属性.
再看看对类的实例对象, 它们的显示结果.
- '''
- 遇到问题没人解答? 小编创建了一个 Python 学习交流 QQ 群:***
- 寻找有志同道合的小伙伴, 互帮互助, 群里还有不错的视频学习教程和 PDF 电子书!
- '''
- >>> s = supcls()
- >>> c = childcls()
- >>> s.__dict__.keys()
- dict_keys([])
- >>> c.__dict__.keys()
- dict_keys([])
- >>> dir(s)
- ['__class__', '__delattr__', '__dict__',
- ......
- 'hello']
- >>> dir(c)
- ['__class__', '__delattr__', '__dict__',
- ......
- 'hello', 'world']
设置对象自己的属性, 再查看:
- '''
- 遇到问题没人解答? 小编创建了一个 Python 学习交流 QQ 群:***
- 寻找有志同道合的小伙伴, 互帮互助, 群里还有不错的视频学习教程和 PDF 电子书!
- '''
- >>> s.hello()
- >>> s.__dict__.keys()
- dict_keys(['data1'])
- >>> dir(s)
- ['__class__', '__delattr__', '__dict__',
- ......
- 'data1', 'hello']
- >>> c.world()
- >>> c.__dict__.keys()
- dict_keys(['data2'])
- >>> dir(c)
- ['__class__', '__delattr__', '__dict__',
- ......
- 'data2', 'hello', 'world']
- >>> c.hello()
- >>> c.__dict__.keys()
- dict_keys(['data2', 'data1'])
- >>> dir(c)
- ['__class__', '__delattr__', '__dict__',
- ......
- 'data1', 'data2', 'hello', 'world']
在作用上
dict 是一个 dict, 它和数据对象的属性直接关联, 可以直接通过 dict 访问, 设置, 修改, 删除属性, 比如类的对象实例可以通过 self.x=3 设置 x 属性, 也可以通过 dict['x']=3 来设置属性 x. 而 dir()函数仅仅只是展现一些属性.
例如:
- >>> c.__dict__['newkey']="NEWKEY"
- >>> c.__dict__.keys()
- dict_keys(['data2', 'data1', 'newkey'])
上面通过 dict 设置了一个新属性 newkey, 现在 newkey 已经是对象 c 的一个对象属性了. 上面的设置方式和 c.newkey="NEWKEY" 是等价的.
python 的 dir()和__dict__属性的区别
来源: http://www.bubuko.com/infodetail-3281916.html