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中处理时间的几种方法小结
Apr 09 Python
举例讲解Python中装饰器的用法
Apr 27 Python
Python最火、R极具潜力 2017机器学习调查报告
Dec 11 Python
Python Json序列化与反序列化的示例
Jan 31 Python
python的concat等多种用法详解
Nov 28 Python
python开头的coding设置方法
Aug 08 Python
python中property属性的介绍及其应用详解
Aug 29 Python
基于FME使用Python过程图解
May 13 Python
Python爬虫获取豆瓣电影并写入excel
Jul 31 Python
python上下文管理器异常问题解决方法
Feb 07 Python
python 制作一个gui界面的翻译工具
May 14 Python
Python万能模板案例之matplotlib绘制甘特图
Apr 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读取目录及子目录下所有文件名的方法
2014/10/20 PHP
php接口实现拖拽排序功能
2018/04/23 PHP
PHP实现微信退款功能
2018/10/02 PHP
js创建对象的几种常用方式小结(推荐)
2010/10/24 Javascript
原生javascript实现的分页插件pagenav
2014/08/28 Javascript
window.location.reload 刷新使用分析(去对话框)
2015/11/11 Javascript
Bootstrap每天必学之媒体对象
2015/11/30 Javascript
详解AngularJS中$http缓存以及处理多个$http请求的方法
2016/02/06 Javascript
AngularJS 避繁就简的路由
2016/07/01 Javascript
bootstrap PrintThis打印插件使用详解
2017/02/20 Javascript
浅谈webpack 自动刷新与解析
2018/04/09 Javascript
layer弹出层自适应高度,垂直水平居中的实现
2019/09/16 Javascript
python脚本内运行linux命令的方法
2015/07/02 Python
TensorFlow Session会话控制&Variable变量详解
2018/07/30 Python
Windows下PyCharm安装图文教程
2018/08/27 Python
pandas 转换成行列表进行读取与Nan处理的方法
2018/10/30 Python
PyQt5固定窗口大小的方法
2019/06/18 Python
在Python中合并字典模块ChainMap的隐藏坑【推荐】
2019/06/27 Python
pandas的排序和排名的具体使用
2019/07/31 Python
对Django中内置的User模型实例详解
2019/08/16 Python
python+selenium 点击单选框-radio的实现方法
2019/09/03 Python
Django实现文件上传下载功能
2019/10/06 Python
python3中sys.argv的实例用法
2020/04/24 Python
浅谈matplotlib 绘制梯度下降求解过程
2020/07/12 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
2020/10/15 Python
python 发送邮件的示例代码(Python2/3都可以直接使用)
2020/12/03 Python
AmazeUI 单选框和多选框的实现示例
2020/08/18 HTML / CSS
西班牙在线宠物商店:zooplus.es
2017/02/24 全球购物
英国女性运动服品牌:Sweaty Betty
2018/11/08 全球购物
博士生入学考试推荐信
2013/11/17 职场文书
大学辅导员事迹材料
2014/02/05 职场文书
黄河象教学反思
2014/02/10 职场文书
化妆品店促销方案
2014/02/24 职场文书
财务工作失职检讨书
2014/11/21 职场文书
保险公司2016开门红口号集锦
2015/12/24 职场文书
党组织关系的介绍信模板
2019/06/21 职场文书