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'}不属于归属?
答案 0 :(得分:5)
在Python中,可以从实例访问class
和instance
属性。
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