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中的对象拷贝示例 python引用传递
Jan 23 Python
Python判断操作系统类型代码分享
Nov 22 Python
从Python的源码来解析Python下的freeblock
May 11 Python
python内置函数:lambda、map、filter简单介绍
Nov 16 Python
Python面向对象编程之继承与多态详解
Jan 16 Python
python爬取各类文档方法归类汇总
Mar 22 Python
Python单向链表和双向链表原理与用法实例详解
Aug 31 Python
pytest中文文档之编写断言
Sep 12 Python
安装2019Pycharm最新版本的教程详解
Oct 22 Python
解决pyshp UnicodeDecodeError的问题
Dec 06 Python
flask 使用 flask_apscheduler 做定时循环任务的实现
Dec 10 Python
Python3 全自动更新已安装的模块实现
Jan 06 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入库和出库
2013/06/25 PHP
ThinkPHP3.1新特性之多数据库操作更加完善
2014/06/19 PHP
php根据数据id自动生成编号的实现方法
2016/10/16 PHP
laravel实现按时间日期进行分组统计方法示例
2019/03/23 PHP
Laravel5.1 框架控制器基础用法实例分析
2020/01/04 PHP
PHP Web表单生成器案例分析
2020/06/02 PHP
用jQuery模拟页面加载进度条的实现代码
2011/12/19 Javascript
JQuery UI的拖拽功能实现方法小结
2012/03/14 Javascript
利用Javascript判断操作系统的类型实现不同操作系统下的兼容性
2013/01/29 Javascript
JS操作Cookies的小例子
2013/10/15 Javascript
javascript客户端遍历控件与获取父容器对象示例代码
2014/01/06 Javascript
jquery重复提交请求的原因浅析
2014/05/23 Javascript
第三章之Bootstrap 表格与按钮功能
2016/04/25 Javascript
javascript中获取class的简单实现
2016/07/12 Javascript
Bootstrap 填充Json数据的实例代码
2017/01/11 Javascript
彻底解决 webpack 打包文件体积过大问题
2017/07/07 Javascript
JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
2019/09/03 jQuery
vue中使用element组件时事件想要传递其他参数的问题
2019/09/18 Javascript
如何正确理解vue中的key详解
2019/11/02 Javascript
JavaScript 变量,数据类型基础实例详解【变量、字符串、数组、对象等】
2020/01/04 Javascript
[05:43]VG.R战队教练Mikasa专访:为目标从未停止战斗
2016/08/02 DOTA
[01:10:27]DOTA2-DPC中国联赛正赛 SAG vs XG BO3 第二场 3月5日
2021/03/11 DOTA
Python爬虫:通过关键字爬取百度图片
2017/02/17 Python
Python实现文件信息进行合并实例代码
2018/01/17 Python
flask框架中勾子函数的使用详解
2018/08/01 Python
python微信好友数据分析详解
2018/11/19 Python
python reverse反转部分数组的实例
2018/12/13 Python
python字符串分割及字符串的一些常规方法
2019/07/24 Python
处理Selenium3+python3定位鼠标悬停才显示的元素
2019/07/31 Python
Python读取yaml文件的详细教程
2020/07/21 Python
自荐信格式范文
2013/10/07 职场文书
班级学习计划书
2014/04/27 职场文书
交通安全标语
2014/06/06 职场文书
村长反四风问题个人对照检查材料
2014/09/21 职场文书
2015迎新晚会开场白
2015/07/17 职场文书
Python中常见的反爬机制及其破解方法总结
2021/06/10 Python