2010-07-17 100 views
1

我對Python(2.6.5)的這種行爲感到困惑,有人可以解釋爲什麼會發生這種情況嗎?由另一個實例繼承對父類的更改的Python對象實例

class A(): 
    mylist=[] 


class B(A): 
    j=0 
    def addToList(self): 
     self.mylist.append(1) 


b1 = B() 
print len(b1.mylist) # prints 0 , as A.mylist is empty 
b1.addToList() 
print len(b1.mylist) # prints 1 , as we have added to A.mylist via addToList() 

b2 = B() 
print len(b2.mylist) # prints 1 !!! Why ????? 

回答

2

你需要做的:

class A: 
    def __init__(self): 
     self.mylist=[] 

這樣self.mylist是一個實例變量。如果你在方法外定義它,它是一個類變量,並在所有實例之間共享。

在B如果你定義構造函數,你必須顯式調用的構造函數:

class B(A): 
    def __init__(self): 
     A.__init__(self) 

這在Python tutorial解釋(不是很清楚)。

+0

謝謝!那很快! :-) – PyNoob123 2010-07-17 19:33:37

+0

只是很好的時機:) – Skilldrick 2010-07-17 19:35:35

2

此代碼創建的所有實例(或子類)

class A(): 
    mylist=[] 

你想要做的是其中一個共享MYLIST:

class A(): 
    def __init__(self): 
     self.mylist=[] 

你可能已經看到了什麼是人誰做:

class A(): 
    somevariable = a 
    def doit(self): 
     self.somevariable = 5 

這是可行的,因爲它會創建一個新的「somevariable」屬性,因爲您正在執行as signment。在此之前,所有A實例共享某些變量的相同副本。只要你不改變那個很好的副本。當變量被賦值時,它會被替換而不是被修改。所以這個技術只有在所討論的值是不可變的時候纔是真正安全的(也就是說,你不能改變它們,你只能替換它們)。但是,我認爲這是一個非常糟糕的主意,你應該總是分配所有變量init