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实现基于HTTP文件传输实例
Nov 08 Python
Python实现多并发访问网站功能示例
Jun 19 Python
python的concat等多种用法详解
Nov 28 Python
python 调用有道api接口的方法
Jan 03 Python
基于MATLAB和Python实现MFCC特征参数提取
Aug 13 Python
Python 通过截图匹配原图中的位置(opencv)实例
Aug 27 Python
利用Python的sympy包求解一元三次方程示例
Nov 22 Python
python interpolate插值实例
Jul 06 Python
Python爬虫爬取糗事百科段子实例分享
Jul 31 Python
Python实现加密的RAR文件解压的方法(密码已知)
Sep 11 Python
Python帮你解决手机qq微信内存占用太多问题
Feb 15 Python
python playwrigh框架入门安装使用
Jul 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
重置版宣传动画
2020/04/09 魔兽争霸
选择PHP作为网站开发语言的原因分享
2012/01/03 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
thinkphp学习笔记之多表查询
2014/07/28 PHP
PHP 数组基本操作小结(推荐)
2016/06/13 PHP
centos+php+coreseek+sphinx+mysql之一coreseek安装篇
2016/10/25 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
基于laravel缓冲cache的用法详解
2019/10/23 PHP
PHP基于openssl实现非对称加密代码实例
2020/06/19 PHP
在你的网页中嵌入外部网页的方法
2007/04/02 Javascript
jQuery中 noConflict() 方法使用
2013/04/25 Javascript
javascript实例分享---具有立体效果的图片特效
2014/06/08 Javascript
JS+CSS实现自动改变切换方向图片幻灯切换效果的方法
2015/03/02 Javascript
js实现跨域的几种方法汇总(图片ping、JSONP和CORS)
2015/10/25 Javascript
基于jQuery实现点击最后一行实现行自增效果的表格
2016/01/12 Javascript
简单实现js选项卡切换效果
2016/02/03 Javascript
Bootstrap自动适应PC、平板、手机的Bootstrap栅格系统
2016/05/27 Javascript
浅谈JS之tagNaem和nodeName
2016/09/13 Javascript
jQuery获取table下某一行某一列的值实现代码
2017/04/07 jQuery
bootstrap table表格使用方法详解
2017/04/26 Javascript
JS实现标签页切换效果
2017/05/04 Javascript
常见的浏览器Hack技巧整理
2017/06/29 Javascript
详解使用jest对vue项目进行单元测试
2018/09/07 Javascript
Vue组件之高德地图地址选择功能的实例代码
2019/06/21 Javascript
layer弹出层取消遮罩的方法
2019/09/25 Javascript
Python数据结构与算法之字典树实现方法示例
2017/12/13 Python
Python实现的爬取小说爬虫功能示例
2019/03/30 Python
python实现远程控制电脑
2019/05/23 Python
如何基于Python Matplotlib实现网格动画
2020/07/20 Python
Watch Station官方网站:世界一流的手表和智能手表
2020/01/05 全球购物
工程造价自荐信
2013/10/09 职场文书
电子商务个人职业生涯规划范文
2014/02/12 职场文书
收款委托书
2014/10/14 职场文书
抄袭同学作业检讨书1000字
2014/11/20 职场文书
数学教师求职信范文
2015/03/20 职场文书
2015年度企业工作总结
2015/05/21 职场文书