我一直在試圖理解Python對類和實例變量的處理。特別是,我發現this answer相當有幫助。基本上它說,如果你聲明一個類變量,然後你做了一個分配到[instance].property
,你將分配給一個不同的變量 - 一個在不同的名字空間的類變量。對Python類和實例變量的複合賦值
於是我認爲 - 如果我想我的類的每個實例有一些默認值的成員(說零),我應該做這樣的:
class Foo:
num = 0
或這樣嗎?
class Foo:
def __init__(self):
self.num = 0
基於我早一點看,我認爲第二個例子是初始化「正確」的變量(實例,而不是類變量)。但是,我發現第一種方法也可以很好地工作:
class Foo:
num = 0
bar = Foo()
bar.num += 1 # good, no error here, meaning that bar has an attribute 'num'
bar.num
>>> 1
Foo.num
>>> 0 # yet the class variable is not modified! so what 'num' did I add to just now?
那麼......爲什麼這樣工作?我沒有得到什麼? FWIW,我之前對OOP的理解來自C++,所以用類比的方式來解釋(或者指出它的分解點)可能是有用的。
而當我說類/實例'變量'我真正的意思是'屬性'。 – MattH 2010-03-11 11:56:12