我有两个对象从基类继承功能。我希望能够独立地对那些类进行更改,同时共享基类的功能。但是,我发现对一个对象的更改会影响另一个对象。我以前从未遇到过这个问题。这是怎么回事?
下面是如何设置的示例:
#!/bin/python3
class Base(object):
inputs = []
def __init__(self, inputs):
for i in inputs:
self.inputs.append(i)
class Thing1(Base):
def __init__(self, inputs):
super(Thing1, self).__init__(inputs)
class Thing2(Base):
def __init__(self, inputs):
super(Thing2, self).__init__(inputs)
t1 = Thing1(["Llama"])
print(t1.inputs)
t2 = Thing2(["Donkey", "Goat"])
print(t2.inputs)
print(t1.inputs)
这将打印以下内容:
['Llama']
['Llama', 'Donkey', 'Goat']
['Llama', 'Donkey', 'Goat']
我要打印:
['Llama']
['Donkey', 'Goat']
['Llama']
我如何从正在做的事情转到想要做的事情?为什么我的课程不能独立更新?
编辑:已解决。感谢Mark Meyer提供的解决方案:
class Base(object):
def __init__(self, inputs):
self.inputs = []
for i in inputs:
self.inputs.append(i)
答案 0 :(得分:3)
您需要在inputs
中定义__init__()
和实例属性。否则,您将拥有一个在各个实例之间共享的类属性。
class Base(object):
def __init__(self, inputs):
self.inputs = []
for i in inputs:
self.inputs.append(i)
答案 1 :(得分:2)
因为您已将inputs
定义为类级别成员-而不是对象级别成员。这些成员由该类的所有实例共享。这就是为什么要对其进行修改。
class X:
a = ...
这里a
是类级别的。这意味着它属于该类。
class X:
def __init__(self):
self.a = ...
这里a
是对象级的。它属于对象。
答案 2 :(得分:2)
class Base(object):
inputs = []
...
这将声明一个类变量inputs
,类似于静态变量(如果您来自C ++或Java)。
class Base(object):
def __init__(...):
self.inputs = []
...
这使其成为实例变量。您希望在__init__
内部而不是在类中创建它。
答案 3 :(得分:1)
问题在于您如何声明inputs
列表。像这样在类中(在函数外部)声明它,使该类以及所有对其进行扩展的类都成为“静态”变量。
要解决此问题,请在self.inputs = []
函数内设置__init__
。
class Base(object):
def __init__(self, inputs):
self.inputs = []
for i in inputs:
self.inputs.append(i)
答案 4 :(得分:1)
因为inputs
属于整个类,而不是每个对象。更改
class Base(object):
inputs = []
到
class Base(object):
def __init__(self):
self.inputs = []