基于Python __dict__与dir()的区别详解


Posted in Python onOctober 30, 2017

Python下一切皆对象,每个对象都有多个属性(attribute),Python对属性有一套统一的管理方案。

__dict__与dir()的区别:

dir()是一个函数,返回的是list;

__dict__是一个字典,键为属性名,值为属性值;

dir()用来寻找一个对象的所有属性,包括__dict__中的属性,__dict__是dir()的子集;

并不是所有对象都拥有__dict__属性。许多内建类型就没有__dict__属性,如list,此时就需要用dir()来列出对象的所有属性。

__dict__属性

__dict__是用来存储对象属性的一个字典,其键为属性名,值为属性的值。

#!/usr/bin/python
# -*- coding: utf-8 -*-
class A(object):
  class_var = 1
  def __init__(self):
    self.name = 'xy'
    self.age = 2

  @property
  def num(self):
    return self.age + 10

  def fun(self):pass
  def static_f():pass
  def class_f(cls):pass

if __name__ == '__main__':#主程序
  a = A()
  print a.__dict__  #{'age': 2, 'name': 'xy'}  实例中的__dict__属性
  print A.__dict__  
  '''
  类A的__dict__属性
  {
  '__dict__': <attribute '__dict__' of 'A' objects>, #这里如果想深究的话查看参考链接5
  '__module__': '__main__',        #所处模块
  'num': <property object>,        #特性对象 
  'class_f': <function class_f>,     #类方法
  'static_f': <function static_f>,    #静态方法
  'class_var': 1, 'fun': <function fun >, #类变量
  '__weakref__': <attribute '__weakref__' of 'A' objects>, 
  '__doc__': None,            #class说明字符串
  '__init__': <function __init__ at 0x0000000003451AC8>}
  '''

  a.level1 = 3
  a.fun = lambda :x
  print a.__dict__ #{'level1': 3, 'age': 2, 'name': 'xy','fun': <function <lambda> at 0x>}
  print A.__dict__ #与上述结果相同

  A.level2 = 4
  print a.__dict__ #{'level1': 3, 'age': 2, 'name': 'xy'}
  print A.__dict__ #增加了level2属性

  print object.__dict__
  '''
  {'__setattr__': <slot wrapper '__setattr__' of 'object' objects>, 
  '__reduce_ex__': <method '__reduce_ex__' of 'object' objects>, 
  '__new__': <built-in method __new__ of type object at>, 
  等.....
  '''

从上述代码可知,

实例的__dict__仅存储与该实例相关的实例属性,

正是因为实例的__dict__属性,每个实例的实例属性才会互不影响。

类的__dict__存储所有实例共享的变量和函数(类属性,方法等),类的__dict__并不包含其父类的属性。

dir()函数

dir()是Python提供的一个API函数,dir()函数会自动寻找一个对象的所有属性(包括从父类中继承的属性)。

一个实例的__dict__属性仅仅是那个实例的实例属性的集合,并不包含该实例的所有有效属性。所以如果想获取一个对象所有有效属性,应使用dir()。

print dir(A)
'''
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'class_f', 'class_var', 'fun', 'level1', 'level2', 'name', 'num', 'static_f']
'''
a_dict = a.__dict__.keys()
A_dict = A.__dict__.keys()
object_dict = object.__dict__.keys()
print a_dict 
print A_dict 
print object_dict 
'''
['fun', 'level1', 'age', 'name']

['__module__', 'level2', 'num', 'static_f', '__dict__', '__weakref__', '__init__', 'class_f', 'class_var', 'fun', '__doc__']

['__setattr__', '__reduce_ex__', '__new__', '__reduce__', '__str__', '__format__', '__getattribute__', '__class__', '__delattr__', '__subclasshook__', '__repr__', '__hash__', '__sizeof__', '__doc__', '__init__']
'''

#因为每个类都有一个__doc__属性,所以需要去重,去重后然后比较
print set(dir(a)) == set(a_dict + A_dict + object_dict) #True

结论

dir()函数会自动寻找一个对象的所有属性,包括__dict__中的属性。

__dict__是dir()的子集,dir()包含__dict__中的属性。

以上这篇基于Python __dict__与dir()的区别详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现的二叉树算法和kmp算法实例
Apr 25 Python
python中对list去重的多种方法
Sep 18 Python
python实现的守护进程(Daemon)用法实例
Jun 02 Python
python使用电子邮件模块smtplib的方法
Aug 28 Python
Python模拟登陆实现代码
Jun 14 Python
PyQt5每天必学之布局管理
Apr 19 Python
python 异或加密字符串的实例
Oct 14 Python
python处理“
Jun 10 Python
解决pytorch-yolov3 train 报错的问题
Feb 18 Python
Python中SQLite如何使用
May 27 Python
python中把元组转换为namedtuple方法
Dec 09 Python
selenium携带cookies模拟登陆CSDN的实现
Jan 19 Python
浅谈使用Python变量时要避免的3个错误
Oct 30 #Python
Python中进程和线程的区别详解
Oct 29 #Python
python logging日志模块的详解
Oct 29 #Python
解决出现Incorrect integer value: '' for column 'id' at row 1的问题
Oct 29 #Python
Python批量更改文件名的实现方法
Oct 29 #Python
python生成二维码的实例详解
Oct 29 #Python
python 读写中文json的实例详解
Oct 29 #Python
You might like
理解php原理的opcodes(操作码)
2010/10/26 PHP
百度ping方法使用示例 自动ping百度
2014/01/26 PHP
php中的ini配置原理详解
2014/10/14 PHP
php使用GD2绘制几何图形示例
2017/02/15 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
2017/08/30 PHP
event.keyCode键码值表 附只能输入特定的字符串代码
2009/05/15 Javascript
浅析jQuery的链式调用之each函数
2010/12/03 Javascript
ToolTips JQEURY插件之简洁小提示框效果
2011/11/19 Javascript
javascript中onmouse事件在div中失效问题的解决方法
2012/01/09 Javascript
node.js中的定时器nextTick()和setImmediate()区别分析
2014/11/26 Javascript
js实现类似菜单风格的TAB选项卡效果代码
2015/08/28 Javascript
NodeJS连接MongoDB数据库时报错的快速解决方法
2016/05/13 NodeJs
微信小程序 数据访问实例详解
2016/10/08 Javascript
JS实现的简单拖拽功能示例
2017/03/13 Javascript
jquery.guide.js新版上线操作向导镂空提示jQuery插件(推荐)
2017/05/20 jQuery
20行js代码实现的贪吃蛇小游戏
2017/06/20 Javascript
微信小程序实现刷脸登录
2018/05/25 Javascript
浅谈vue 单文件探索
2018/09/05 Javascript
layui-select动态选中值的例子
2019/09/23 Javascript
Vue搭建后台系统需要注意的问题
2019/11/08 Javascript
Javascript原生ajax请求代码实例
2020/02/20 Javascript
详谈Object.defineProperty 及实现数据双向绑定
2020/07/18 Javascript
Python中使用Beautiful Soup库的超详细教程
2015/04/30 Python
浅谈python中set使用
2016/06/30 Python
CentOS 6.5下安装Python 3.5.2(与Python2并存)
2017/06/05 Python
python实现数独游戏 java简单实现数独游戏
2018/03/30 Python
对命令行模式与python交互模式介绍
2018/05/12 Python
详解如何减少python内存的消耗
2019/08/09 Python
HTML5实现分享到微信好友朋友圈QQ好友QQ空间微博二维码功能
2018/01/03 HTML / CSS
html5的canvas方法使用指南
2014/12/15 HTML / CSS
公司人力资源的自我评价
2014/01/02 职场文书
竞选文艺委员演讲稿
2014/04/28 职场文书
企业口号大全
2014/06/12 职场文书
乡镇干部个人整改措施思想汇报
2014/10/10 职场文书
英国数字版游戏销量周榜公布 《小缇娜的奇幻之地》登顶
2022/04/03 其他游戏
python小型的音频操作库mp3Play
2022/04/24 Python