基于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调用C语言开发的共享库方法实例
Mar 18 Python
python采集百度百科的方法
Jun 05 Python
Python开发如何在ubuntu 15.10 上配置vim
Jan 25 Python
解决python3 urllib中urlopen报错的问题
Mar 25 Python
使用pytorch进行图像的顺序读取方法
Jul 27 Python
Python爬虫小技巧之伪造随机的User-Agent
Sep 13 Python
python web自制框架之接受url传递过来的参数实例
Dec 17 Python
python读取并定位excel数据坐标系详解
Jun 26 Python
python图形绘制奥运五环实例讲解
Sep 14 Python
pytorch实现保证每次运行使用的随机数都相同
Feb 20 Python
使用python向MongoDB插入时间字段的操作
May 18 Python
Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案
Apr 20 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
利用phpexcel把excel导入数据库和数据库导出excel实现
2014/01/09 PHP
php生成二维码
2015/08/10 PHP
PHP入门教程之PHP操作MySQL的方法分析
2016/09/11 PHP
关于javascript DOM事件模型的两件事
2010/07/22 Javascript
Extjs4中tree的拖拽功能(可以两棵树之间拖拽) 简单实例
2013/12/08 Javascript
简单选项卡 js和jquery制作方法分享
2014/02/26 Javascript
Javascript单元测试框架QUnitjs详细介绍
2014/05/08 Javascript
JS长整型精度问题实例分析
2015/01/13 Javascript
jQuery实现鼠标划过展示大图的方法
2015/03/09 Javascript
javascript实现类似java中getClass()得到对象类名的方法
2015/07/27 Javascript
Bootstrap零基础入门教程(三)
2016/07/18 Javascript
jQuery实现的省市县三级联动菜单效果完整实例
2016/08/01 Javascript
使用bat打开多个cmd窗口执行gulp、node
2017/02/17 Javascript
vue.js项目打包上线的图文教程
2017/11/16 Javascript
iview table高度动态设置方法
2018/03/14 Javascript
vue+vant 上传图片需要注意的地方
2021/01/03 Vue.js
在Django的视图中使用数据库查询的方法
2015/07/16 Python
Python中map,reduce,filter和sorted函数的使用方法
2015/08/17 Python
python数据预处理之将类别数据转换为数值的方法
2017/07/05 Python
详解python实现线程安全的单例模式
2018/03/05 Python
python使用knn实现特征向量分类
2018/12/26 Python
解决Django中多条件查询的问题
2019/07/18 Python
在python image 中安装中文字体的实现方法
2019/08/22 Python
Python加密模块的hashlib,hmac模块使用解析
2020/01/02 Python
django实现后台显示媒体文件
2020/04/07 Python
10分钟入门CSS3 Animation
2018/12/25 HTML / CSS
学校经典推荐信
2013/10/30 职场文书
简短大学毕业感言
2014/01/18 职场文书
英语感谢信范文
2015/01/20 职场文书
企业承诺书格式范文
2015/04/28 职场文书
杨善洲电影观后感
2015/06/04 职场文书
毕业班班主任工作总结2015
2015/07/23 职场文书
2016春季幼儿园小班开学寄语
2015/12/03 职场文书
护理培训心得体会
2016/01/22 职场文书
建房合同协议书
2016/03/21 职场文书
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS