为什么实例没有属性?

时间:2013-01-20 09:16:20

标签: 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'

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

2 个答案:

答案 0 :(得分:5)

在Python中,可以从实例访问classinstance属性。

http://docs.python.org/2/reference/datamodel.html中的参考Class instances阐明了其工作原理 -

  

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

您可以分别使用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'}

myVersion属性现在同时存在于Test(类)和t(实例)的命名空间中,可以安全地删除它们而不会引发AttributeError

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

答案 1 :(得分:3)

问题是变量没有附加到实例,它附加到整个类。要解决这个问题,你必须实际附加它(好吧,也许不是物理上,但你理解我的意思。)

class Test:
    def __init__(self):
        self.myVersion = '1.0'

然后你可以删除它。

t = Test()
del t.myVersion  # no exception raised