[英]What is the proper way to access python class variables?
上課
class A(object):
z = 0
def Func1(self):
return self.z
def Func2(self):
return A.z
這兩種方法( Func1
和Func2
)給出的結果相同,僅包含在此人工示例中,以說明如何解決z
的兩種可能方法。
僅當實例使用諸如self.z = None
類的self.z = None
遮蔽z
時, Func*
的結果才會不同。
使用Func1
或Func2
的語法訪問類變量z
的正確python方法是什么?
我會說,訪問變量的正確方法很簡單:
a_instance.z #instance variable 'z'
A.z #class variable 'z'
這里不需要Func1
和Func2
。
附帶說明一下,如果您必須編寫Func2
,則似乎合適的classmethod
是:
@classmethod
def Func2(cls):
return cls.z
最后要注意的是,您在方法中使用的版本( self.z
, Az
和cls.z
和classmethod
)實際上取決於您希望API表現如何。 您是否希望用戶能夠通過設置實例屬性z
來遮蔽Az
? 如果是這樣,請使用self.z
如果您不希望出現陰影,可以使用Az
。 該方法需要self
嗎? 如果不是,則可能是類方法等。
我通常會使用self.z
,因為如果子類的z
值不同,它將選擇“正確的”。 不這樣做的唯一原因是,即使您知道始終會需要A
版本。
通過self或通過classmethod(請參見mgilson的答案)進行訪問也有助於創建mixin類。
如果您不在乎價值破壞之類的事情,那么self.z
。 否則, Az
無疑將評估為class變量。 但是要注意,如果子類B
重新定義z
而不是 Func2
會發生什么:
class B(A):
z = 7
b = B()
b.Func2() # Returns 0, not 7
畢竟,這很合邏輯。 因此,如果您想以某種某種多態的方式訪問類變量,則可以執行以下操作之一:
self.__class__.z
type(self).z
根據文檔 ,第二種形式不適用於舊式類,因此第一種形式通常在Python 2.x版本之間更具兼容性。 但是,對於新樣式的類,因此對於Python 3.x,第二種形式是最安全的形式,因為類可以重新定義__class__
屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.