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 相关文章推荐
python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
Feb 24 Python
详解Python之数据序列化(json、pickle、shelve)
Mar 30 Python
python函数中return后的语句一定不会执行吗?
Jul 06 Python
Python字符编码与函数的基本使用方法
Sep 30 Python
Windows下的Python 3.6.1的下载与安装图文详解(适合32位和64位)
Feb 21 Python
对python中xlsx,csv以及json文件的相互转化方法详解
Dec 25 Python
python matplotlib画图库学习绘制常用的图
Mar 19 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
Jun 13 Python
Flask框架学习笔记之模板操作实例详解
Aug 15 Python
django中url映射规则和服务端响应顺序的实现
Apr 02 Python
python 实现rolling和apply函数的向下取值操作
Jun 08 Python
Django怎么在admin后台注册数据库表
Nov 14 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封装一个异常的处理类
2017/06/08 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法
2013/08/08 Javascript
Jquery中给animation加更多的运作效果实例
2013/09/05 Javascript
JavaScript中匿名、命名函数的性能测试
2014/09/04 Javascript
js数组的基本操作(很全自己整理的)
2014/10/16 Javascript
JS实现屏蔽网页右键复制及ctrl+c复制的方法【2种方法】
2016/09/04 Javascript
JS实现点击网页判断是否安装app并打开否则跳转app store
2016/11/18 Javascript
jQuery无刷新上传之uploadify简单代码
2017/01/17 Javascript
nodejs+express实现文件上传下载管理网站
2017/03/15 NodeJs
React中使用collections时key的重要性详解
2017/08/07 Javascript
利用javascript如何随机生成一定位数的密码
2017/09/22 Javascript
Bootstrap实现下拉菜单多级联动
2017/11/23 Javascript
node 标准输入流和输出流代码实例
2019/09/19 Javascript
[01:11:46]DOTA2-DPC中国联赛 正赛 iG vs Magma BO3 第一场 2月23日
2021/03/11 DOTA
Python中的推导式使用详解
2015/06/03 Python
完美解决Pycharm无法导入包的问题 Unresolved reference
2018/05/18 Python
Python实现的微信好友数据分析功能示例
2018/06/21 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
2018/07/18 Python
使用Python创建简单的HTTP服务器的方法步骤
2019/04/26 Python
python list多级排序知识点总结
2019/10/23 Python
mac 上配置Pycharm连接远程服务器并实现使用远程服务器Python解释器的方法
2020/03/19 Python
Django视图类型总结
2021/02/17 Python
应届毕业生的个人自我鉴定
2013/10/24 职场文书
中层干部岗位职责
2013/12/18 职场文书
证券期货行业个人的自我评价
2013/12/26 职场文书
母亲节演讲稿范文
2014/01/02 职场文书
自我鉴定注意事项
2014/01/19 职场文书
互联网电子商务专业毕业生求职信
2014/03/18 职场文书
党组织公开承诺书
2014/03/29 职场文书
全国税务系统先进集体事迹材料
2014/05/19 职场文书
幼儿园课题方案
2014/06/09 职场文书
公司承诺书格式范文
2015/04/28 职场文书
导游词之南京中山陵
2019/11/27 职场文书
Java用自带的Image IO给图片添加水印
2021/06/15 Java/Android
分享几种python 变量合并方法
2022/03/20 Python