簡體   English   中英

訪問python類變量的正確方法是什么?

[英]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

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

僅當實例使用諸如self.z = None類的self.z = None遮蔽z時, Func*的結果才會不同。

使用Func1Func2的語法訪問類變量z的正確python方法是什么?

我會說,訪問變量的正確方法很簡單:

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

這里不需要Func1Func2


附帶說明一下,如果您必須編寫Func2 ,則似乎合適的classmethod是:

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

最后要注意的是,您在方法中使用的版本( self.zAzcls.zclassmethod )實際上取決於您希望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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM