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中使用Beautiful Soup库的超详细教程
Apr 30 Python
Windows下安装python MySQLdb遇到的问题及解决方法
Mar 16 Python
Python多继承顺序实例分析
May 26 Python
Python 切分数组实例解析
Nov 07 Python
详解python itertools功能
Feb 07 Python
python图形界面开发之wxPython树控件使用方法详解
Feb 24 Python
Pytorch转onnx、torchscript方式
May 25 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
Jun 11 Python
python中线程和进程有何区别
Jun 17 Python
详解Python yaml模块
Sep 23 Python
python实现马丁策略的实例详解
Jan 15 Python
Python WSGI 规范简介
Apr 11 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 getsiteurl()函数
2009/09/05 PHP
PHP 判断变量类型实现代码
2009/10/23 PHP
ThinkPHP实现将本地文件打包成zip下载
2014/06/26 PHP
Javascript实现仿WebQQ界面的“浮云”兼容 IE7以上版本及FF
2011/04/27 Javascript
Jquery多选下拉列表插件jquery multiselect功能介绍及使用
2013/05/24 Javascript
js实现连续英文字符自动换行兼容ie6 ie7和firefox
2013/09/06 Javascript
jQuery实现图片放大预览实现原理及代码
2013/09/12 Javascript
angular.element方法汇总
2015/01/07 Javascript
js仿百度登录页实现拖动窗口效果
2016/03/11 Javascript
JavaScript学习笔记整理_setTimeout的应用
2016/09/19 Javascript
switch语句的妙用(必看篇)
2016/10/03 Javascript
浅谈jQuery hover(over, out)事件函数
2016/12/03 Javascript
javascript实现页面滚屏效果
2017/01/17 Javascript
AngularJS页面传参的5种方式
2017/04/01 Javascript
JS传播事件、取消事件默认行为、阻止事件传播详解
2017/08/14 Javascript
puppeteer库入门初探
2019/01/09 Javascript
js中怎么判断两个字符串相等的实例
2019/01/17 Javascript
详解如何给React-Router添加路由页面切换时的过渡动画
2019/04/25 Javascript
jquery图片预览插件实现方法详解
2019/07/18 jQuery
微信小程序 flexbox layout快速实现基本布局的解决方案
2020/03/24 Javascript
Python 实现取多维数组第n维的前几位
2019/11/26 Python
Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析
2020/03/30 Python
在脚本中单独使用django的ORM模型详解
2020/04/01 Python
django实现后台显示媒体文件
2020/04/07 Python
python 写函数在一定条件下需要调用自身时的写法说明
2020/06/01 Python
最好的意大利皮夹克:D’Arienzo
2018/12/04 全球购物
汽车检测与维修应届毕业生求职信
2013/10/19 职场文书
领导的自我鉴定
2013/12/28 职场文书
转党组织关系介绍信
2014/01/08 职场文书
运动会广播稿300字
2014/01/10 职场文书
2014年学校工会工作总结
2014/12/06 职场文书
2015年教师节感恩寄语
2015/03/23 职场文书
2015年大学班级工作总结
2015/04/28 职场文书
2016党员入党决心书
2015/09/22 职场文书
教师个人教学反思
2016/02/23 职场文书
OpenCV-Python实现人脸磨皮算法
2021/06/07 Python