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 控制语句
Nov 03 Python
Python守护进程(daemon)代码实例
Mar 06 Python
Python字符串匹配算法KMP实例
Jul 18 Python
Python中二维列表如何获取子区域元素的组成
Jan 19 Python
Python各类图像库的图片读写方式总结(推荐)
Feb 23 Python
python和shell获取文本内容的方法
Jun 05 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
Jun 10 Python
python设计tcp数据包协议类的例子
Jul 23 Python
python求加权平均值的实例(附纯python写法)
Aug 22 Python
Python Numpy中数据的常用保存与读取方法
Apr 01 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
Nov 28 Python
pandas按照列的值排序(某一列或者多列)
Dec 13 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
一个php作的文本留言本的例子(四)
2006/10/09 PHP
PHP中动态HTML的输出技术
2006/10/09 PHP
遍历指定目录下的所有目录和文件的php代码
2011/11/27 PHP
最新最全PHP生成制作验证码代码详解(推荐)
2016/06/12 PHP
laravel 5.4中实现无限级分类的方法示例
2017/07/27 PHP
JavaScript 仿关机效果的图片层
2008/12/26 Javascript
JavaScript用JQuery呼叫Server端方法示例代码
2014/09/03 Javascript
JS 新增Cookie 取cookie值 删除cookie 举例详解
2014/10/10 Javascript
javascript中几个容易混淆的概念总结
2015/04/14 Javascript
javascript实现C语言经典程序题
2015/11/29 Javascript
Dojo获取下拉框的文本和值实例代码
2016/05/27 Javascript
浅谈jQuery animate easing的具体使用方法(推荐)
2016/06/17 Javascript
Bootstrap表单布局
2016/07/19 Javascript
js中判断变量类型函数typeof的用法总结
2016/08/09 Javascript
js实现对table的增加行和删除行的操作方法
2016/10/13 Javascript
简单的jQuery拖拽排序效果的实现(增强动态)
2017/02/09 Javascript
react配合antd组件实现的管理系统示例代码
2018/04/24 Javascript
vue+vant-UI框架实现购物车的复选框全选和反选功能
2019/11/05 Javascript
ES2020让代码更优美的运算符 (?.) (??)
2021/01/04 Javascript
[03:03]DOTA2 2017国际邀请赛开幕战队入场仪式
2017/08/09 DOTA
[01:57]2018年度DOTA2最具潜力解说-完美盛典
2018/12/16 DOTA
详解Python中for循环的使用
2015/04/14 Python
python数据结构之图的实现方法
2015/07/08 Python
Django学习教程之静态文件的调用详解
2018/05/08 Python
python实现一个点绕另一个点旋转后的坐标
2019/12/04 Python
python FTP批量下载/删除/上传实例
2019/12/22 Python
python用TensorFlow做图像识别的实现
2020/04/21 Python
html5使用html2canvas实现浏览器截图的示例
2017/08/31 HTML / CSS
Finishline官网:美国一家领先的运动品牌鞋类、服装零售商
2016/07/20 全球购物
淘宝客服自我总结鉴定
2014/01/25 职场文书
单位消防安全责任书
2014/07/23 职场文书
党员查摆剖析材料
2014/10/10 职场文书
群众路线教育实践活动整改落实情况汇报
2014/10/28 职场文书
楚门的世界观后感
2015/06/03 职场文书
2016廉洁从业学习心得体会
2016/01/19 职场文书
python中urllib包的网络请求教程
2022/04/19 Python