2012-11-19 92 views
0

有一個類什麼是訪問python類變量的正確方法?

class A(object): 
    z = 0 

    def Func1(self): 
     return self.z 

    def Func2(self): 
     return A.z 

這兩種方法(Func1Func2)給出相同的結果,並且僅包含在此人工的例子來說明的如何解決z的兩種可能的方法。

Func*的結果只會在實例影響zself.z = None之類的情況下有所不同。

使用Func1Func2的語法訪問類變量z的適當python方法是什麼?

回答

3

我要說的是,適當的方式來獲得訪問變量只是:

a_instance.z #instance variable 'z' 
A.z   #class variable 'z' 

無需Func1Func2這裏。


作爲一個側面說明,如果你必須Func2,這似乎是一個classmethod可能是適當的:

@classmethod 
def Func2(cls): 
    return cls.z 

最後要注意,你的方法中使用的版本(self.zA.zcls.zclassmethod)真的取決於您希望API如何運作。您是否希望用戶能夠通過設置實例屬性z來影響A.z?如果是這樣,那麼使用self.z。如果你不想要那個陰影,你可以使用A.z。該方法是否需要self?如果不是,那麼它可能是一個classmethod等

+0

謝謝你的回答。我只以'Func1'和'Func2'爲例來說明如何解決'z'問題。我喜歡你的想法,看看API應該如何表現。所以我想這是我正在尋找的答案。 – Woltan

1

我通常會使用self.z,因爲如果有z不同值的子類,它會選擇「正確的」。不這樣做的唯一原因是,如果你知道你會永遠需要A版本,儘管如此。

通過自我或通過classmethod訪問(請參閱mgilson的答案)也有助於創建mixin類。

0

如果你不關心價值clobbering和類似的東西,你可以用self.z罰款。否則,A.z無疑將評估類變量。小心,不過,如果一個子類B重新定義z將會發生什麼不Func2

class B(A): 
    z = 7 

b = B() 
b.Func2() # Returns 0, not 7 

這是相當合乎邏輯的,畢竟。所以,如果你想訪問類變量中,不知何故,多態性方式,你可以做以下之一:

self.__class__.z 
type(self).z 

According to the documentation,第二種形式不與老式類工作,所以第一種形式通常在Python 2.x版本中更具可比性。然而,第二種形式對於新風格的類是最安全的,因此對於Python 3.x來說,因爲類可能會重新定義__class__屬性。

相關問題