为什么所有班级都受一个班级变更的影响?

时间:2019-04-11 15:42:32

标签: python class

我有两个对象从基类继承功能。我希望能够独立地对那些类进行更改,同时共享基类的功能。但是,我发现对一个对象的更改会影响另一个对象。我以前从未遇到过这个问题。这是怎么回事?

下面是如何设置的示例:

#!/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)

5 个答案:

答案 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 = []