2012-01-03 52 views
6

直接在類定義下定義的字典和列表充當靜態(例如,this question
其他變量(如整數)怎麼沒有?爲什麼有些類變量看起來像靜態而其他類不變?

>>> class Foo(): 
     bar=1 

>>> a=Foo() 
>>> b=Foo() 
>>> a.bar=4 
>>> b.bar 
1 
>>> class Foo(): 
     bar={} 

>>> a=Foo() 
>>> b=Foo() 
>>> a.bar[7]=8 
>>> b.bar 
{7: 8} 
+0

檢查五花八門的答案[這裏](http://stackoverflow.com/questions/8701500/python-class-instance-variables-and-class-variables/8701647#8701647)的 – joaquin 2012-01-03 08:25:53

+0

可能重複的http:/ /stackoverflow.com/questions/68645/static-class-variables-in-python – gecco 2012-01-03 08:37:10

回答

15

它們都是類變量。除了您分配a.bar=4時創建實例變量。基本上Python有一個查詢順序的屬性。有云:

instance -> class -> parent classes in MRO order (left to right) 

所以,如果你有

class Foo(object): 
    bar = 1 

這是在類Foo的變量。一旦你這樣做

a = Foo() 
a.bar = 2 

你已經創建了一個新的變量對象a上名爲bar。如果你看看a.__class__.bar,你仍然會看到1,但由於前面提到的順序,它是有效隱藏的。

您創建的字典在類級別,因此它在該類的所有實例之間共享。

6

當您分配

>>> a.bar=4 

重新綁定Foo.bar4,這是一個整數的新實例。在另一方面,

>>> a.bar[7]=8 

不重新綁定Foo.bar於什麼不同,並簡單的修改,這個名字指的是字典。

如果你

​​

,那麼你將重新綁定Foo.bar字典。

1

假設a被的AA一個實例已類屬性bar

  • a.bar = 4創建一個實例屬性bar其中隱藏在a

  • a.bar[4] = 2僅修改上下文類bar類級別bar綁定的對象(假設它支持索引)

  • a.bar += 1 - 這一個是討厭。如果類級bar支持+=操作(例如通過實施__iadd__()),則它在原地被修改並且不創建對象級屬性。否則,它相當於a.bar = a.bar + 1,並且創建了一個新的實例屬性bar

相關問題