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语言编写电脑时间自动同步小工具
Mar 08 Python
Python异常处理总结
Aug 15 Python
python实现闹钟定时播放音乐功能
Jan 25 Python
python OpenCV学习笔记之绘制直方图的方法
Feb 08 Python
Python从Excel中读取日期一列的方法
Nov 28 Python
200行python代码实现2048游戏
Jul 17 Python
Python面向对象之Web静态服务器
Sep 03 Python
Python绘制二维曲线的日常应用详解
Dec 04 Python
Python 实现Serial 与STM32J进行串口通讯
Dec 18 Python
python 实现逻辑回归
Dec 30 Python
详解使用python爬取抖音app视频(appium可以操控手机)
Jan 26 Python
基于Pygame实现简单的贪吃蛇游戏
Dec 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调用Java对象的方法
2006/10/09 PHP
解析htaccess伪静态的规则
2013/06/18 PHP
PHP图片处理之图片旋转和图片翻转实例
2014/11/19 PHP
PHP实现负载均衡的加权轮询方法分析
2018/08/22 PHP
jquery为页面增加快捷键示例
2014/01/31 Javascript
从零学JSON之JSON数据结构
2014/05/19 Javascript
javascript arguments使用示例
2014/12/16 Javascript
javascript折半查找详解
2015/01/26 Javascript
js中for in语句的用法讲解
2015/04/24 Javascript
js控制div弹出层实现方法
2015/05/11 Javascript
Knockout结合Bootstrap创建动态UI实现产品列表管理
2016/09/14 Javascript
HTML中setCapture、releaseCapture 使用方法浅析
2016/09/25 Javascript
JS 对java返回的json格式的数据处理方法
2016/12/05 Javascript
在页面中引入js的两种方法(推荐)
2017/08/29 Javascript
Vue 中使用 CSS Modules优雅方法
2018/04/09 Javascript
node微信开发之获取access_token+自定义菜单
2019/03/17 Javascript
vue3.0 搭建项目总结(详细步骤)
2019/05/20 Javascript
layui默认选中table的CheckBox复选框方法
2019/09/19 Javascript
js实现select下拉框选择
2020/01/11 Javascript
JavaScript事件循环及宏任务微任务原理解析
2020/09/02 Javascript
jquery简易手风琴插件的封装
2020/10/13 jQuery
React Native登录之指纹登录篇的示例代码
2020/11/03 Javascript
Python实现的随机森林算法与简单总结
2018/01/30 Python
在Python中构建增广矩阵的实现方法
2019/07/01 Python
PyCharm导入python项目并配置虚拟环境的教程详解
2019/10/13 Python
基于numpy中的expand_dims函数用法
2019/12/18 Python
Python找出列表中出现次数最多的元素三种方式
2020/02/24 Python
更新升级python和pip版本后不生效的问题解决
2020/04/17 Python
Pycharm创建python文件自动添加日期作者等信息(步骤详解)
2021/02/03 Python
你常见到的runtime exception
2016/09/05 面试题
Java程序员面试题
2013/07/15 面试题
大家检讨书5000字
2014/02/03 职场文书
《两只鸟蛋》教学反思
2014/02/10 职场文书
2015年大学元旦晚会活动策划书
2014/12/09 职场文书
幼儿园端午节活动总结
2015/05/05 职场文书
2016年大学光棍节活动总结
2016/04/05 职场文书