python中dir()与__dict__属性的区别浅析


Posted in Python onDecember 10, 2018

前言

只要是有属性的数据对象(不一定是面向对象的对象实例,而是指具有数据类型的数据对象),都可以通过__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__中既包含了名称,也包含了值。

>>> 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的属性。

再看看对类的实例对象,它们的显示结果。

>>> 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']

设置对象自己的属性,再查看:

>>> 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 相关文章推荐
Python图像灰度变换及图像数组操作
Jan 27 Python
Python3调用微信企业号API发送文本消息代码示例
Nov 10 Python
在mac下查找python包存放路径site-packages的实现方法
Nov 06 Python
梅尔频率倒谱系数(mfcc)及Python实现
Jun 18 Python
python使用mitmproxy抓取浏览器请求的方法
Jul 02 Python
python区块及区块链的开发详解
Jul 03 Python
python3 打印输出字典中特定的某个key的方法示例
Jul 06 Python
执行Python程序时模块报错问题
Mar 26 Python
解决Jupyter notebook更换主题工具栏被隐藏及添加目录生成插件问题
Apr 20 Python
关于python的缩进规则的知识点详解
Jun 22 Python
无需压缩软件,用python帮你操作压缩包
Aug 17 Python
python开发制作好看的时钟效果
May 02 Python
python分块读取大数据,避免内存不足的方法
Dec 10 #Python
Python 文本文件内容批量抽取实例
Dec 10 #Python
Python中作用域的深入讲解
Dec 10 #Python
python实现根据文件关键字进行切分为多个文件的示例
Dec 10 #Python
Python文件常见操作实例分析【读写、遍历】
Dec 10 #Python
一篇文章搞懂Python的类与对象名称空间
Dec 10 #Python
django使用LDAP验证的方法示例
Dec 10 #Python
You might like
JAVA/JSP学习系列之二
2006/10/09 PHP
zf框架的数据库追踪器使用示例
2014/03/13 PHP
PHP调试函数和日志记录函数分享
2015/01/31 PHP
Yii2框架BootStrap样式的深入理解
2016/11/07 PHP
php curl中gzip的压缩性能测试实例分析
2016/11/08 PHP
颜色选择器 Color Picker,IE,Firefox,Opera,Safar
2010/11/25 Javascript
javascript与webservice的通信实现代码
2010/12/25 Javascript
jquery选择器之属性过滤选择器详解
2014/01/27 Javascript
jquery实现瀑布流效果分享
2014/03/26 Javascript
使用jquery组件qrcode生成二维码及应用指南
2015/02/22 Javascript
jQuery判断数组是否包含了指定的元素
2015/03/10 Javascript
解决WordPress使用CDN后博文无法评论的错误
2015/12/15 Javascript
Angular2内置指令NgFor和NgIf详解
2016/08/03 Javascript
详解js树形控件—zTree使用总结
2016/12/28 Javascript
jQuery插件select2利用ajax高效查询大数据列表(可搜索、可分页)
2017/05/19 jQuery
Javascript删除数组里的某个元素
2019/02/28 Javascript
laravel-admin 与 vue 结合使用实例代码详解
2019/06/04 Javascript
vue项目中使用bpmn为节点添加颜色的方法
2020/04/30 Javascript
vue实现简易图片左右旋转,上一张,下一张组件案例
2020/07/31 Javascript
浅谈JavaScript 声明提升
2020/09/14 Javascript
Javascript新手入门之字符串拼接与变量的应用
2020/12/03 Javascript
Python一键查找iOS项目中未使用的图片、音频、视频资源
2019/08/12 Python
如何基于Python批量下载音乐
2019/11/11 Python
python实现跨excel sheet复制代码实例
2020/03/03 Python
ASOS英国官网:英国在线时装和化妆品零售商
2017/05/19 全球购物
亚历山大·王官网:Alexander Wang
2017/06/23 全球购物
自我评价范文点评
2013/12/04 职场文书
《中彩那天》教学反思
2014/02/22 职场文书
总结表彰大会主持词
2014/03/26 职场文书
企业文化标语口号
2014/06/09 职场文书
售房委托书
2014/08/30 职场文书
舞蹈社团活动总结
2015/05/07 职场文书
2015小学语文教师个人工作总结
2015/05/20 职场文书
《葡萄沟》教学反思
2016/02/23 职场文书
2019年年中工作总结讲话稿模板
2019/03/25 职场文书
如何通过cmd 连接阿里云服务器
2022/04/18 Servers