4
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'} 是不是归属地?

4

2 回答 2

5

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

参考http://docs.python.org/2/reference/datamodel.html阐明了这是如何工作Class instances的-

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

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

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

例如,

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

myVersion属性现在存在于Test(class) 和t(instance) 的命名空间中,并且可以安全地从任何一个中删除,而无需引发AttributeError.

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

于 2013-01-20T09:51:01.007 回答
3

问题是变量没有附加到实例,它附加到整个类。要解决此问题,您必须将其物理连接(好吧,也许不是物理连接,但您明白我的意思)到实例。

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

然后你可以删除它。

t = Test()
del t.myVersion  # no exception raised
于 2013-01-20T09:20:02.427 回答