由另一个实例继承对父类的更改的Python对象实例

问题描述:

我对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 ????? 

你需要做的:

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

此代码创建的所有实例(或子类)

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