为什么实例没有属性?

it_*_*ure 4 python

class Test():    
       myVersion="1.0" 
t=Test()   
t.myVersion    
--> 1.0

Test.myVersion="2.0"  
Test.x={'myVersion':'1.0'}
Test.x  
--> {'myVersion': '1.0'}

t.x 
--> {'myVersion': '1.0'}

del t.x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: Test instance has no attribute 'x'
Run Code Online (Sandbox Code Playgroud)

为什么实例没有属性x
{'myVersion':'1.0'}不属于归属?

sid*_*idi 5

在Python,无论是classinstance属性是从实例进行访问.

参考Class instanceshttp://docs.python.org/2/reference/datamodel.html阐明如何工作-

通过调用类对象来创建类实例(参见上文).类实例具有作为字典实现的名称空间,该字典是搜索属性引用的第一个位置.当在那里找不到属性,并且实例的类具有该名称的属性时,搜索继续使用类属性.

您可以分别使用Test.__dict__和查看您的类和实例的命名空间t.__dict__.

有趣的是,如果通过从实例引用类属性来修改类属性,则class属性将保持不受影响.相反,具有更改的属性的副本将添加到实例的命名空间.

例如,

>>> t = Test()  
>>> t.myVersion = "2.0"  
>>> Test.__dict__
{'__module__': '__main__', 'myversion': '1.0', '__doc__': None}
>>> t.__dict__
{'myVersion': '2.0'}
Run Code Online (Sandbox Code Playgroud)

myVersion属性现在存在于Test(类)和t(实例)的命名空间中,并且可以安全地从任一个中删除而不会引发AttributeError.

基本思想是,您尝试从对象中删除的变量应该存在于其名称空间中.