2013-06-12 43 views
4

我不是程序員,我正在嘗試學習python。但是我對這個對象實例化有點困惑。我覺得類像一個模板和對象是基於模板make(或實例化)。 這並不意味着一旦創建對象(例如,classinst1 = MyClass()),模板中的更改不應該影響對象中的內容?請幫我理解python對象的實例。

另外,下面的代碼表明我可以改變類變量「common」,但前提是我沒有爲對象中的「common」變量賦值一個新值。 如果我在對象中指定了一個新值(比如classinst1.common = 99),那麼更改我的類變量「common」不會再影響classinst.common的值?

有人可以請澄清爲什麼下面的代碼表現這樣的方式?所有的OO語言都是常見的,還是Python的一個奇怪的方面?

===============

>>> class MyClass(object): 
...  common = 10 
...  def __init__(self): 
...    self.myvar=3 
...  def myfunction(self,arg1,arg2): 
...    return self.myvar 
... 
>>> classinst1 = MyClass() 
>>> classinst1.myfunction(1,2) 
3 
>>> classinst2 = MyClass() 
>>> classinst2.common 
10 
>>> classinst1.common 
10 
>>> MyClass.common = 50 
>>> classinst1.common 
50 
>>> classinst2.common 
50 
>>> classinst1.common = 99 
>>> classinst2.common 
50 
>>> classinst1.common 
99 
>>> MyClass.common = 7000 
>>> classinst1.common 
99 
>>> classinst2.common 
7000 
+0

它很常見,如果一個類中的變量在它前面沒有自己,那麼這個類的所有實例 – bwbrowning

回答

7

你有類的聲明和實例化權的總體思路。但是爲什麼你的例子中的輸出看起來沒有意義的原因是,實際上有兩個變量叫做common。第一種是在類聲明中聲明並實例化的代碼頂部的類變量。這是您的大部分示例中唯一的common

當執行這一行:

classinst1.common = 99 

要創建的對象變量的classinst1成員。由於它與類變量名稱相同,因此它會陰影或隱藏MyClass.common。所有對classinst1.common的進一步引用現在引用該對象變量,而對classinst2.common的所有引用繼續回退到MyClass.common,因爲沒有名爲common的對象變量是classinst2的成員。

因此,當你執行:當你要求的classinst1.commonclassinst2.common值解釋

MyClass.common = 7000 

這改變MyClass.commonclassinst1.common仍等於99.而在你的榜樣的最後幾行,前者是指到classinst1對象成員變量common而後者引用類變量MyClass.common