基于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()的区别详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。