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获取指定目录下所有文件名列表的方法
May 20 Python
Python django实现简单的邮件系统发送邮件功能
Jul 14 Python
Python模块搜索路径代码详解
Jan 29 Python
Python使用logging模块实现打印log到指定文件的方法
Sep 05 Python
Python实现多属性排序的方法
Dec 05 Python
Python 元组拆包示例(Tuple Unpacking)
Dec 24 Python
Python计算指定日期是今年的第几天(三种方法)
Mar 26 Python
jupyter notebook插入本地图片的实现
Apr 13 Python
python根据完整路径获得盘名/路径名/文件名/文件扩展名的方法
Apr 22 Python
Pycharm连接远程服务器过程图解
Apr 30 Python
使用python求斐波那契数列中第n个数的值示例代码
Jul 26 Python
pytorch 实现L2和L1正则化regularization的操作
Mar 03 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 SQL之where语句生成器
2009/03/24 PHP
使用php来实现网络服务
2009/09/15 PHP
PHP5函数小全(分享)
2013/06/06 PHP
yii框架通过控制台命令创建定时任务示例
2014/04/30 PHP
详解WordPress中过滤链接与过滤SQL语句的方法
2015/12/18 PHP
php版本CKEditor 4和CKFinder安装及配置方法图文教程
2019/06/05 PHP
PHP7创建销毁session的实例方法
2020/02/03 PHP
fireworks菜单生成器mm_menu.js在 IE 7.0 显示问题的解决方法
2009/10/20 Javascript
js 模拟气泡屏保效果代码
2010/07/10 Javascript
js实现页面转发功能示例代码
2013/08/05 Javascript
jQuery的text()方法用法分析
2014/12/20 Javascript
JavaScript插件化开发教程(六)
2015/02/01 Javascript
使用Node.js配合Nginx实现高负载网络
2015/06/28 Javascript
jQuery实现带延时功能的水平多级菜单效果【附demo源码下载】
2016/09/21 Javascript
JavaScript利用闭包实现模块化
2017/01/13 Javascript
jQuery实现模糊搜索功能的方法分析
2018/06/29 jQuery
vue-cli初始化项目中使用less的方法
2018/08/09 Javascript
微信小程序实现二维码签到考勤系统
2020/01/16 Javascript
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
vue-router 2.0 跳转之router.push()用法说明
2020/08/12 Javascript
python自动化工具日志查询分析脚本代码实现
2013/11/26 Python
使用python将时间转换为指定的格式方法
2018/11/12 Python
详解python做UI界面的方法
2019/02/27 Python
简单了解python gevent 协程使用及作用
2019/07/22 Python
新年福利来一波之Python轻松集齐五福(demo)
2020/01/20 Python
CSS3对图片照片进行边缘模糊处理的实现
2018/08/08 HTML / CSS
css3实现3D色子翻转特效
2014/12/23 HTML / CSS
美国汽车零部件和配件网站:CarParts
2019/03/13 全球购物
美国唇部护理专家:Sara Happ
2019/06/19 全球购物
网络安全方面的面试题
2015/11/04 面试题
自我评价200字分享
2013/12/17 职场文书
学徒工职责
2014/03/06 职场文书
大队干部竞选演讲稿
2014/04/28 职场文书
公共场所禁烟标语
2014/06/25 职场文书
2015教师见习期工作总结
2014/12/12 职场文书
浅谈Go语言多态的实现与interface使用
2021/06/16 Golang