首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么所有类都会受到对一个类的更改的影响?

为什么所有类都会受到对一个类的更改的影响?
EN

Stack Overflow用户
提问于 2019-04-11 23:42:32
回答 5查看 59关注 0票数 3

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

下面是一个如何设置的示例:

代码语言:javascript
复制
#!/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)

这将打印以下内容:

代码语言:javascript
复制
['Llama']
['Llama', 'Donkey', 'Goat']
['Llama', 'Donkey', 'Goat']

我想把它打印出来:

代码语言:javascript
复制
['Llama']
['Donkey', 'Goat']
['Llama']

我如何从我正在做的事情到我想要做的事情?为什么我的类没有独立更新?

编辑:已解决。感谢Mark Meyer的解决方案:

代码语言:javascript
复制
class Base(object):

    def __init__(self, inputs):
        self.inputs = []
        for i in inputs:
            self.inputs.append(i)
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2019-04-11 23:47:58

您需要通过在__init__()中定义来创建inputs和实例属性。否则,您将拥有一个在实例之间共享的类属性。

代码语言:javascript
复制
class Base(object):
    def __init__(self, inputs):
        self.inputs = []
        for i in inputs:
            self.inputs.append(i)
票数 3
EN

Stack Overflow用户

回答已采纳

发布于 2019-04-11 23:47:58

问题在于如何声明inputs列表。像这样在类中声明它(在函数外部)就是在类和所有扩展它的类上使它成为一个“静态”变量。

要解决此问题,请在__init__函数中设置self.inputs = []

代码语言:javascript
复制
class Base(object):
    def __init__(self, inputs):
        self.inputs = []

        for i in inputs:
            self.inputs.append(i)
票数 3
EN

Stack Overflow用户

发布于 2019-04-11 23:48:05

因为您已经将inputs定义为类级成员,而不是对象级成员。这些成员由类的所有实例共享。这就是它被修改的原因。

代码语言:javascript
复制
class X:
    a = ...

在这里,a是类级别的。这意味着它属于这个类。

代码语言:javascript
复制
class X:
    def __init__(self):
        self.a = ...

这里的a是对象级的。它属于对象。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55636387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档