[英]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(self).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.