由另一个实例继承对父类的更改的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解释(不是很清楚)。
答
此代码创建的所有实例(或子类)
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
谢谢!那很快! :-) – PyNoob123 2010-07-17 19:33:37
只是很好的时机:) – Skilldrick 2010-07-17 19:35:35