Python:在子类中更新父类的实例变量

时间:2018-12-05 14:02:03

标签: python-3.x

我对此进行了很多搜索,但似乎找不到与我的问题有关的任何东西。

说我有三个单独的python文件fileA.py,fileB.py和fileMain.py

fileB.py继承自fileA.py。

fileA.py

class Parent():
    def __init__(self):
        self.valueA = 5

fileB.py

from fileA import Parent

class Child(Parent):
    def __init__(self):
        Parent.__init__():
        self.valueB = 10

    def Calculate(self):
        self.result = self.valueB + self.valueA
        print(self.result)

在fileMain.py中,我有一些代码需要更改父类中的子类AFTER valueA之后的子类中的Calculate方法。

from fileA import Parent
from fileB import Child

class MainProgram():
    def __init__(self):
        self.parent = Parent()
        self.child = Child()

        self.parent.valueA = 8

        self.child.Calculate()

foobar=MainProgram()

我的问题是,打印输出是15,而不是18。为什么?我该如何解决才能获得预期的结果?

我希望fileB.py从fileA.py继承的原因是我计划让fileC.py也从fileA.py继承,并使用self.valueA在此进行其他计算。值A应该由程序的用户设置。我在这里简化了事情。希望这有意义吗?

对不起,如果我使用的术语错误。请纠正我。 :)

1 个答案:

答案 0 :(得分:1)

您似乎不清楚classesinstances(也称为objects)的工作方式。

ParentChildMainProgramclasses。您可以将它们视为蓝图。他们不变

实例化一个类时,您会得到一个instance,例如:

parent = Parent()
child = Child()

parentchild是实例。调用parent.valueA = 8时,您正在instance上更改名为parent的值。

调用child.Calculate()parent实例无关。当您实例化Child()时,将调用Parent()构造函数,因此child.valueA被设置为等于5。您需要致电child.valueA = 8才能对其进行更改。

有关更多信息,请考虑阅读以下内容:https://realpython.com/python3-object-oriented-programming/

(编辑:顺便说一下,您是从fileA引用fileB的方式,依此类推。这是对术语的不正确使用。一个文件不会从另一个文件 继承。您可能会说一个模块 imports 从另一个 module 。一个类 inherits 从另一个 class

EDIT2:

如果您的目标是在所有实例之间共享state的{​​{1}},则可以为其使用Borg模式。本质上,每个Borg实例与所有其他实例共享其状态。因此,如果您先进行Parentparent1 = Parent(),然后再进行parent2 = Parent(),那么parent1.valueA = 8也将等于parent2.valueA

它是这样的:

8