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程序与服务器连接的WSGI接口
Apr 29 Python
Python编写生成验证码的脚本的教程
May 04 Python
Python实现telnet服务器的方法
Jul 10 Python
基于python的Tkinter实现一个简易计算器
Dec 31 Python
Python cookbook(数据结构与算法)字典相关计算问题示例
Feb 18 Python
python Tkinter的图片刷新实例
Jun 14 Python
python笔记之mean()函数实现求取均值的功能代码
Jul 05 Python
详解Django定时任务模块设计与实践
Jul 24 Python
Python爬虫实例——爬取美团美食数据
Jul 15 Python
解决python存数据库速度太慢的问题
Apr 23 Python
Python快速优雅的批量修改Word文档样式
May 20 Python
浅谈Python数学建模之数据导入
Jun 23 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
Zend Studio去除编辑器的语法警告设置方法
2012/10/24 PHP
php实现数组中索引关联数据转换成json对象的方法
2015/07/08 PHP
javascript 控制弹出窗口
2007/04/10 Javascript
JavaScript Perfection kill 测试及答案
2010/03/23 Javascript
解析ScrollPic在ie8下只滚动一遍,然后变为空白 ie6,ie7,chrome,firefox正常
2013/06/26 Javascript
jquery实现盒子下拉效果示例代码
2013/09/12 Javascript
jquery的live使用注意事项
2014/02/18 Javascript
javascript中style.left和offsetLeft的用法说明
2014/03/07 Javascript
对JavaScript客户端应用编程的一些建议
2015/06/24 Javascript
Bootstrap表单布局样式代码
2016/05/31 Javascript
学习vue.js条件渲染
2016/12/03 Javascript
JS实现颜色梯度与渐变效果完整实例
2016/12/30 Javascript
jQuery.Validate表单验证插件的使用示例详解
2017/01/04 Javascript
微信小程序 数据交互与渲染实例详解
2017/01/21 Javascript
javascript基本数据类型和转换
2017/03/17 Javascript
react 实现页面代码分割、按需加载的方法
2018/04/03 Javascript
vue-cli项目使用mock数据的方法(借助express)
2019/04/15 Javascript
浅谈javascript错误处理
2019/08/11 Javascript
layui点击按钮页面会自动刷新的解决方案
2019/10/25 Javascript
用Angular实现一个扫雷的游戏示例
2020/05/15 Javascript
[43:43]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第三场 11.29
2020/12/02 DOTA
详解用python写网络爬虫-爬取新浪微博评论
2019/05/10 Python
python反转列表的三种方式解析
2019/11/08 Python
详解Python中的分支和循环结构
2020/02/11 Python
python调用有道智云API实现文件批量翻译
2020/10/10 Python
资生堂美国官网:Shiseido美国
2016/09/02 全球购物
俄罗斯EPL钻石珠宝店:ЭПЛ
2019/10/22 全球购物
Tommy Hilfiger澳洲官网:美国高端休闲领导品牌
2020/12/16 全球购物
海飞丝的广告词
2014/03/20 职场文书
上海世博会志愿者口号
2014/06/17 职场文书
兼职安全员岗位职责
2015/02/15 职场文书
2015年销售工作总结范文
2015/03/30 职场文书
幼儿园门卫安全责任书
2015/05/08 职场文书
高一数学教学反思
2016/02/18 职场文书
Python图像处理之图像拼接
2021/04/28 Python
python神经网络学习 使用Keras进行简单分类
2022/05/04 Python