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使用dis模块把Python反编译为字节码的用法详解
Jun 14 Python
Python简单实现查找一个字符串中最长不重复子串的方法
Mar 26 Python
python获取网页中所有图片并筛选指定分辨率的方法
Mar 31 Python
Python网络编程使用select实现socket全双工异步通信功能示例
Apr 09 Python
Django框架模板文件使用及模板文件加载顺序分析
May 23 Python
200行python代码实现2048游戏
Jul 17 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
Oct 14 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
Jan 16 Python
python之生成多层json结构的实现
Feb 27 Python
python让函数不返回结果的方法
Jun 22 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
Dec 17 Python
python 实现图片批量压缩的示例
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
《Re:从零开始的异世界生活 冰结之绊》
2020/04/09 日漫
PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用
2012/05/07 PHP
PDO::getAvailableDrivers讲解
2019/01/28 PHP
jQuery中slideUp()方法用法分析
2014/12/24 Javascript
JS实现模拟风力的雪花飘落效果
2015/05/13 Javascript
Angularjs注入拦截器实现Loading效果
2015/12/28 Javascript
node.js cookie-parser 中间件介绍
2016/06/06 Javascript
微信小程序 省市区选择器实例详解(附源码下载)
2017/01/05 Javascript
原生js实现电商侧边导航效果
2017/01/19 Javascript
jQuery实现弹窗居中效果类似alert()
2017/02/27 Javascript
vue监听滚动事件实现滚动监听
2017/04/11 Javascript
微信小程序 rich-text的使用方法
2017/08/04 Javascript
vue2.0父子组件间传递数据的方法
2018/08/16 Javascript
layui使用数据表格实现购物车功能
2019/07/26 Javascript
用JS实现选项卡
2020/03/23 Javascript
Vue 实现一个简单的鼠标拖拽滚动效果插件
2020/12/10 Vue.js
Tornado Web服务器多进程启动的2个方法
2014/08/04 Python
把pandas转换int型为str型的方法
2019/01/29 Python
python实现词法分析器
2019/01/31 Python
python matplotlib画图库学习绘制常用的图
2019/03/19 Python
详解Python 定时框架 Apscheduler原理及安装过程
2019/06/14 Python
基于Python实现大文件分割和命名脚本过程解析
2019/09/29 Python
MNIST数据集转化为二维图片的实现示例
2020/01/10 Python
Python调用接口合并Excel表代码实例
2020/03/31 Python
keras中的卷积层&池化层的用法
2020/05/22 Python
scrapy中如何设置应用cookies的方法(3种)
2020/09/22 Python
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2016/01/06 面试题
《草原的早晨》教学反思
2014/04/08 职场文书
中英文求职信范文
2015/03/19 职场文书
2015年保育员个人工作总结
2015/05/13 职场文书
《莫泊桑拜师》教学反思
2016/02/22 职场文书
Django给表单添加honeypot验证增加安全性
2021/05/06 Python
MySQL的安装与配置详细教程
2021/06/26 MySQL
Java移除无效括号的方法实现
2021/08/07 Java/Android
Redis分布式锁的7种实现
2022/04/01 Redis
分析SQL窗口函数之排名窗口函数
2022/04/21 Oracle