我们都知道Python一切皆对象,那么Python究竟是怎么管理对象的呢?
首先看一下类的__dict__属性和类对象的__dict__属性
#-*-coding:utf-8-*- classA(object): """ ClassA. """ a=0 b=1 def__init__(self): self.a=2 self.b=3 deftest(self): printanormalfunc. @staticmethod defstatic_test(self): printastaticfunc. @classmethod defclass_test(self): printacalssfunc. obj=A() printA.__dict__ printobj.__dict__运行结果如下:
{a:0,__module__:__main__,b:1,class_test:<classmethodobjectat0x00000000021882E8>,__dict__:<attribute__dict__ofAobjects>,__init__:<function__init__at0x00000000023A5BA8>,test:<functiontestat0x00000000023A5C18>,__weakref__:<attribute__weakref__ofAobjects>,__doc__:\nClassA.\n,static_test:<staticmethodobjectat0x00000000021881C8>} {a:2,b:3}由此可见,类的静态函数、类函数、普通函数、全局变量以及一些内置的属性都是放在**类__dict__**里的
**对象的__dict__**中存储了一些self.xxx的一些东西
虽然说一切皆对象,但对象也有不同,就好比不是每个人的女朋友都是一个人一样,一些内置的数据类型是没有__dict__属性的,如下:
num=3 ll=[] dd={} printnum.__dict__ printll.__dict__ printdd.__dict__当我们运行这样的代码时,解释器就会告诉我们
Traceback(mostrecentcalllast): File"f:\python\test.py",line54,in<module> printnum.__dict__ AttributeError:intobjecthasnoattribute__dict__ Traceback(mostrecentcalllast): File"f:\python\test.py",line55,in<module> printll.__dict__ AttributeError:listobjecthasnoattribute__dict__ Traceback(mostrecentcalllast): File"f:\python\test.py",line56,in<module> printdd.__dict__ AttributeError:dictobjecthasnoattribute__dict__int,list,dict等这些常用的数据类型是没有__dict__属性的,其实这是可预料的,就算给了它们dict属性也没啥用,毕竟它们只是用来做数据容器的。
子类有自己的__dict__,父类也有自己的__dict__,子类的全局变量和函数放在子类的dict中,父类的放在父类dict中。
#-*-coding:utf-8-*- classParent(object): a=0 b=1 def__init__(self): self.a=2 self.b=3 defp_test(self): pass classChild(Parent): a=4 b=5 def__init__(self): super(Child,self).__init__() #self.a=6 #self.b=7 defc_test(self): pass defp_test(self): pass p=Parent() c=Child() printParent.__dict__ printChild.__dict__ printp.__dict__ printc.__dict__运行上面的代码,结果入下:
{a:0,__module__:__main__,b:1,__dict__:<attribute__dict__ofParentobjects>,p_test:<functionp_testat0x0000000002325BA8>,__weakref__:<attribute__weakref__ofParentobjects>,__doc__:None,__init__:<function__init__at0x0000000002325B38>} {a:4,c_test:<functionc_testat0x0000000002325C88>,__module__:__main__,b:5,p_test:<functionp_testat0x0000000002325CF8>,__doc__:None,__init__:<function__init__at0x0000000002325C18>} {a:2,b:3} {a:2,b:3}1)上段输出结果中,用红色字体标出的是类变量和函数,由结果可知,每个类的类变量、函数名都放在自己的__dict__中
2)再来看一下实力变量的__dict__中,由蓝色字体标识,父类和子类对象的__dict__是公用的
总结:
1)内置的数据类型没有__dict__属性
2)每个类有自己的__dict__属性,就算存着继承关系,父类的__dict__并不会影响子类的__dict__
3)对象也有自己的__dict__属性,存储self.xxx信息,父子类对象公用__dict__
勘误:
多谢几位同学的@TianYuanSX,@企鹅lin,@halo1234,父子类对象不是公用dict,验证方法3楼已经说了;同时也可以用id(p.__dict__)id(c.__dict__)验证,两个确实不同。
本文内容总结:1、无处不在的__dict__,2、Python里什么没有__dict__属性,3、发生继承时候的__dict__属性,
原文链接:https://www.cnblogs.com/starrysky77/p/9102344.html