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 27 Python
python实现的登录和操作开心网脚本分享
Jul 09 Python
用python 制作图片转pdf工具
Jan 30 Python
好用的Python编辑器WingIDE的使用经验总结
Aug 31 Python
Python实现的选择排序算法原理与用法实例分析
Nov 22 Python
详解小白之KMP算法及python实现
Apr 04 Python
Python 学习教程之networkx
Apr 15 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
May 30 Python
使用python画社交网络图实例代码
Jul 10 Python
使用Python打造一款间谍程序的流程分析
Feb 21 Python
Python 去除字符串中指定字符串
Mar 05 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
PHP去除数组中重复的元素并按键名排序函数
2008/08/18 PHP
使用php检测用户当前使用的浏览器是否为IE浏览器
2013/12/03 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
2015/12/10 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
2018/04/20 PHP
PHP自动生成缩略图函数的源码示例
2019/03/18 PHP
laravel实现上传图片并在页面显示的例子
2019/10/14 PHP
jquery 弹出登录窗口实现代码
2009/12/24 Javascript
JS对外部文件的加载及对IFRMAME的加载的实现,当加载完成后,指定指向方法(方法回调)
2011/07/04 Javascript
JQuery伸缩导航练习示例
2013/11/13 Javascript
jquery预览图片实现鼠标放上去显示实际大小
2014/01/16 Javascript
jQuery实现简易的天天爱消除小游戏
2015/10/16 Javascript
纯javascript实现自动发送邮件
2015/10/21 Javascript
详解javascript中的事件处理
2015/11/06 Javascript
jquery实现简易的移动端验证表单
2015/11/08 Javascript
使用postMesssage()实现跨域iframe页面间的信息传递方法
2016/03/29 Javascript
jQuery选择器总结之常用元素查找方法
2016/08/04 Javascript
jQuery页面弹出框实现文件上传
2017/02/09 Javascript
js中删除数组中的某一元素实例(无下标时)
2017/02/28 Javascript
基于vue监听滚动事件实现锚点链接平滑滚动的方法
2018/01/17 Javascript
vue :src 文件路径错误问题的解决方法
2018/05/15 Javascript
深入理解JS中Number(),parseInt(),parseFloat()三者比较
2018/08/24 Javascript
vue与原生app的对接交互的方法(混合开发)
2018/11/28 Javascript
JavaScript算法学习之冒泡排序和选择排序
2019/11/02 Javascript
微信浏览器下拉黑边解决方案 wScroollFix
2020/01/21 Javascript
Python编程实现输入某年某月某日计算出这一天是该年第几天的方法
2017/04/18 Python
python 重命名轴索引的方法
2018/11/10 Python
Django框架视图函数设计示例
2019/07/29 Python
pycharm激活码有效到2020年11月底
2020/09/18 Python
python如何实现图片压缩
2020/09/11 Python
安装pyinstaller遇到的各种问题(小结)
2020/11/20 Python
html5使用canvas压缩图片的示例代码
2018/09/11 HTML / CSS
台湾网购生鲜第一品牌:i3Fresh爱上新鲜
2017/10/26 全球购物
小米旗下精品生活电商平台:小米有品
2018/12/18 全球购物
2014年政工师工作总结
2014/12/18 职场文书
2015年毕业生实习评语
2015/03/25 职场文书
Mysql排查分析慢sql之explain实战案例
2022/04/19 MySQL