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计算三角函数之acos()方法的使用
May 15 Python
Django admin实现图书管理系统菜鸟级教程完整实例
Dec 12 Python
Python数据类型中的“冒号“[::]——分片与步长操作示例
Jan 24 Python
python3.6.3安装图文教程 TensorFlow安装配置方法
Jun 24 Python
Python中的取模运算方法
Nov 10 Python
pandas每次多Sheet写入文件的方法
Dec 10 Python
python制作mysql数据迁移脚本
Jan 01 Python
Python While循环语句实例演示及原理解析
Jan 03 Python
Python基础之列表常见操作经典实例详解
Feb 26 Python
python解释器安装教程的方法步骤
Jul 02 Python
Python绘图之二维图与三维图详解
Aug 04 Python
python 模块导入问题汇总
Feb 01 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应用程序来获取Web服务器的状态信息
2006/10/09 PHP
一个PHP分页类的代码
2011/05/18 PHP
探讨如何把session存入数据库
2013/06/07 PHP
用PHP和Shell写Hadoop的MapReduce程序
2014/04/15 PHP
PHP MVC框架skymvc支持多文件上传
2016/05/26 PHP
Yii2组件之多图上传插件FileInput的详细使用教程
2016/06/20 PHP
JavaScript中的集合及效率
2010/01/08 Javascript
Json对象与Json字符串互转(4种转换方式)
2013/03/27 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 语法
2015/01/09 Javascript
浅谈jQuery的offset()方法及示例分享
2015/07/17 Javascript
Webwork 实现文件上传下载代码详解
2016/02/02 Javascript
javascript检测移动设备横竖屏
2016/05/21 Javascript
jQuery Ajax页面局部加载方法汇总
2016/06/02 Javascript
js实现控制textarea输入字符串的个数,鼠标按下抬起判断输入字符数
2016/10/25 Javascript
Bootstrap学习笔记之环境配置(1)
2016/12/07 Javascript
详解如何使用webpack打包Vue工程
2017/05/27 Javascript
微信小程序之GET请求的实例详解
2017/09/29 Javascript
Django+Vue跨域环境配置详解
2018/07/06 Javascript
jQuery实现中奖播报功能(让文本滚动起来) 简单设置数值即可
2020/03/20 jQuery
Vue中watch、computed、updated三者的区别及用法
2020/07/27 Javascript
解决Vue的项目使用Element ui 走马灯无法实现的问题
2020/08/03 Javascript
python3实现读取chrome浏览器cookie
2016/06/19 Python
Python退火算法在高次方程的应用
2018/07/26 Python
Python装饰器简单用法实例小结
2018/12/03 Python
命令行运行Python脚本时传入参数的三种方式详解
2019/10/11 Python
python如何求100以内的素数
2020/05/27 Python
Python xlwt模块使用代码实例
2020/06/10 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
2021/02/24 Python
大学学生会竞选演讲稿
2014/04/25 职场文书
应届生求职信
2014/05/31 职场文书
机械机修工岗位职责
2014/08/03 职场文书
检察院院长群众路线教育实践活动个人整改措施
2014/10/04 职场文书
冲出亚马逊观后感
2015/06/03 职场文书
在校生证明
2015/06/17 职场文书
志愿者服务宣传标语口号
2015/12/26 职场文书
AJAX学习笔记
2021/05/18 Javascript