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中的变量和赋值运算符
Oct 12 Python
Python黑魔法@property装饰器的使用技巧解析
Jun 16 Python
总结python爬虫抓站的实用技巧
Aug 09 Python
Python设计模式之MVC模式简单示例
Jan 10 Python
解决tensorflow1.x版本加载saver.restore目录报错的问题
Jul 26 Python
使用urllib库的urlretrieve()方法下载网络文件到本地的方法
Dec 19 Python
Python基于mysql实现学生管理系统
Feb 21 Python
Django中自定义模型管理器(Manager)及方法
Sep 23 Python
Python调用graphviz绘制结构化图形网络示例
Nov 22 Python
PyCharm 无法 import pandas 程序卡住的解决方式
Mar 09 Python
Python如何执行系统命令
Sep 23 Python
python 爬虫爬取京东ps4售卖情况
Dec 18 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
调频问题解答
2021/03/01 无线电
PHP调用三种数据库的方法(1)
2006/10/09 PHP
有关于PHP中常见数据类型的汇总分享
2014/01/06 PHP
thinkPHP学习笔记之安装配置篇
2015/03/05 PHP
php生成rss类用法实例
2015/04/14 PHP
PHP 接入微信扫码支付总结(总结篇)
2016/11/03 PHP
常用参考资料(手册)下载或者链接
2006/07/22 Javascript
Javascript Tab 导航插件 (23个)
2009/06/11 Javascript
DWZ table的原生分页浅谈
2013/03/01 Javascript
javascript中直接写php代码的方法
2013/07/31 Javascript
jQuery实现的导航条切换可显示隐藏
2014/10/22 Javascript
JavaScript在Android的WebView中parseInt函数转换不正确问题解决方法
2015/04/25 Javascript
js操作css属性实现div层展开关闭效果的方法
2015/05/11 Javascript
JQuery点击行tr实现checkBox选中的简单实例
2016/05/26 Javascript
微信小程序进行微信支付的步骤昂述
2016/12/01 Javascript
基于BootStrap multiselect.js实现的下拉框联动效果
2017/07/28 Javascript
node中使用es5/6以及支持性与性能对比
2017/08/11 Javascript
angularJs-$http实现百度搜索时的动态下拉框示例
2018/02/27 Javascript
js实现页面多个日期时间倒计时效果
2019/06/20 Javascript
vue Treeselect 树形下拉框:获取选中节点的ids和lables操作
2020/08/15 Javascript
Ant Design的Table组件去除
2020/10/24 Javascript
[01:28:44]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第一场 1月10日
2021/03/11 DOTA
详解Python中的各种函数的使用
2015/05/24 Python
深入理解Django的自定义过滤器
2017/10/17 Python
简单实现python画圆功能
2018/01/25 Python
利用CSS3的checked伪类实现OL的隐藏显示的方法
2010/12/18 HTML / CSS
css3让div随鼠标移动而抖动起来
2014/02/10 HTML / CSS
纽约JewelryAffairs珠宝店:精细金银时尚首饰
2017/02/05 全球购物
Brookstone美国官网:独特新奇产品
2017/03/04 全球购物
澳大利亚在线划船、露营和钓鱼商店:BCF Australia
2020/03/22 全球购物
村干部承诺书
2014/03/28 职场文书
毕业生就业意向书
2014/04/01 职场文书
自我推荐信格式模板
2015/03/24 职场文书
2019年感恩励志演讲稿(收藏备用)
2019/09/11 职场文书
MySQL之PXC集群搭建的方法步骤
2021/05/25 MySQL
Oracle 死锁的检测查询及处理
2021/09/25 Oracle