簡體   English   中英

從實例訪問類變量

[英]Access class variable from instance

我有這個課:

class ReallyLongClassName:

    static_var = 5

    def instance_method(self):
        ReallyLongClassName.static_var += 1

有什么方法可以使用自變量訪問靜態變量? 我寧願做類似class(self).static_var += 1事情,因為長名稱不可讀。

使用self.__class__.classAttr 這對於新舊樣式類均適用。

答案是“是,但是……”

最好的理解方法是實際嘗試:

>>> class RLCN:
...     static_var = 5
...     def method1(self):
...         RLCN.static_var += 1
...     def method2(self):
...         self.static_var += 1
>>> rlcn = RLCN()
>>> RLCN.static_var, rlcn.static_var
(5, 5)
>>> rlcn.static_var
5
>>> rlcn.method1()
>>> RLCN.static_var, rlcn.static_var
(6, 6)
>>> rlcn.method2()
>>> RLCN.static_var, rlcn.static_var
(6, 7)

發生了什么?

好吧,通過self 訪問 class屬性很好。 如果沒有同名的實例屬性,則獲得類屬性。

但是分配給它會隱藏具有相同名稱的新實例屬性的class屬性。 這可能不是您想要的。

請注意,這意味着您可以將類屬性用作實例屬性的“默認值”或“初始值”。 但是我不確定這樣做是否很Python化; 實際發生的情況以及新手(尤其是來自C ++ 11或Java的人) 認為正在發生的情況都非常不同。

(當您處理諸如方法或@property的描述符時,事情會變得稍微復雜一些,但是讓我們忽略它;在您正在討論的簡單情況下,它是不相關的。)


我寧願做類似class(s​​elf).static_var + = 1的事情,因為長名稱不可讀。

可以,您只需要正確拼寫: type是返回任何對象類型的函數。 所以:

type(self).static_var += 1

這具有動態的附加優勢(例如,當您具有多個繼承並且不知道@property來自哪一方時,出於與您想要的基本相同的原因,您可能不想顯式列出類名。使用super()而不是顯式調用基類方法)。

這樣做的缺點是無法在Python 2.x中使用舊式類,但是無論如何您都不應該使用它們。 特別是在需要類屬性的類中,因為這些正是您以后經常要添加@property @classmethod@property @classmethod等等的類型,而這些都不適合舊式類(以及許多其他東西)。 如果出於某種原因確實需要透明地處理舊樣式和新樣式類,則self.__class__適用於舊樣式類。 我不確定是否可以保證使用新型類。 文檔說type(object)的返回值“通常與object.__class__返回的object.__class__相同”,但沒有說在什么條件下“一般”是不正確的。 它還記錄為3.x中“幾種對象類型”特殊屬性“由實現添加” 在實踐中,我不知道它們在3.x中有什么不同,在2.x中它們最不同的最顯着情況是老式類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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