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

时间:2010-07-17 19:30:47

标签: python

我对Python(2.6.5)的这种行为感到困惑,有人可以解释为什么会发生这种情况吗?

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 个答案:

答案 0 :(得分:2)

你需要这样做:

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

那样self.mylist是一个实例变量。如果在方法之外定义它,它是一个类变量,因此在所有实例之间共享。

在B中,如果定义构造函数,则必须显式调用A的构造函数:

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

Python tutorial中解释(不太清楚)。

答案 1 :(得分:2)

此代码在A(或子类)

的所有实例之间创建共享mylist
class A(): 
    mylist=[]  

您想要做的是:

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

您可能会看到的是:

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

这是有效的,因为它创建了一个新的“somevariable”属性,因为你正在做一个赋值。在此之前,所有A实例共享somevariable的相同副本。只要你不改变副本就好了。当赋值变量时,它会被替换而不是被修改。所以当有问题的值是不可变的时(即你不能改变它们,你只能替换它们),这种技术才真正安全。但是,我认为这是一个非常糟糕的主意,你应该总是在 init中分配所有变量