2013-01-20 211 views
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' 

爲什麼實例沒有屬性x
{'myVersion':'1.0'}是不是歸屬?爲什麼實例沒有屬性?

回答

5

在Python,既classinstance屬性是從實例進行訪問。

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

一個類的實例是通過調用一個類對象(見上文)創建的。 A 類實例具有實現爲字典的名稱空間,該字典是 第一個在其中搜索屬性引用的位置。當在那裏找不到 屬性,並且該實例的類具有該名稱的 屬性時,搜索將繼續使用類 屬性。

您可以分別使用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(類)存在,並且t(實例)的命名空間,並且可以從而不引發AttributeError安全地刪除。

其基本思想是,你想從對象中刪除的變量應該存在於它的名字空間中。

3

問題是變量沒有附加到實例,它連接到全班的要解決這個問題,你必須物理附加它(好吧,也許不是物理,但你明白我的意思)的實例。

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

然後你可以刪除它。

t = Test() 
del t.myVersion # no exception raised 
相關問題