基于Python __dict__与dir()的区别详解
Python下一切皆对象,每个对象都有多个属性(attribute),Python对属性有一套统一的管理方案。
__dict__与dir()的区别:
dir()是一个函数,返回的是list;
__dict__是一个字典,键为属性名,值为属性值;
dir()用来寻找一个对象的所有属性,包括__dict__中的属性,__dict__是dir()的子集;
并不是所有对象都拥有__dict__属性。许多内建类型就没有__dict__属性,如list,此时就需要用dir()来列出对象的所有属性。
__dict__属性
__dict__是用来存储对象属性的一个字典,其键为属性名,值为属性的值。
#!/usr/bin/python #-*-coding:utf-8-*- classA(object): class_var=1 def__init__(self): self.name='xy' self.age=2 @property defnum(self): returnself.age+10 deffun(self):pass defstatic_f():pass defclass_f(cls):pass if__name__=='__main__':#主程序 a=A() printa.__dict__#{'age':2,'name':'xy'}实例中的__dict__属性 printA.__dict__ ''' 类A的__dict__属性 { '__dict__':,#这里如果想深究的话查看参考链接5 '__module__':'__main__',#所处模块 'num': ,#特性对象 'class_f': ,#类方法 'static_f': ,#静态方法 'class_var':1,'fun': ,#类变量 '__weakref__': , '__doc__':None,#class说明字符串 '__init__': } ''' a.level1=3 a.fun=lambda:x printa.__dict__#{'level1':3,'age':2,'name':'xy','fun': at0x>} printA.__dict__#与上述结果相同 A.level2=4 printa.__dict__#{'level1':3,'age':2,'name':'xy'} printA.__dict__#增加了level2属性 printobject.__dict__ ''' {'__setattr__': , '__reduce_ex__': , '__new__': , 等..... '''
从上述代码可知,
实例的__dict__仅存储与该实例相关的实例属性,
正是因为实例的__dict__属性,每个实例的实例属性才会互不影响。
类的__dict__存储所有实例共享的变量和函数(类属性,方法等),类的__dict__并不包含其父类的属性。
dir()函数
dir()是Python提供的一个API函数,dir()函数会自动寻找一个对象的所有属性(包括从父类中继承的属性)。
一个实例的__dict__属性仅仅是那个实例的实例属性的集合,并不包含该实例的所有有效属性。所以如果想获取一个对象所有有效属性,应使用dir()。
printdir(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() printa_dict printA_dict printobject_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__属性,所以需要去重,去重后然后比较 printset(dir(a))==set(a_dict+A_dict+object_dict)#True
结论
dir()函数会自动寻找一个对象的所有属性,包括__dict__中的属性。
__dict__是dir()的子集,dir()包含__dict__中的属性。
以上这篇基于Python__dict__与dir()的区别详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。