【问题标题】:Python: update instance variable of parent class in child classPython:在子类中更新父类的实例变量
【发布时间】:2019-05-07 03:04:27
【问题描述】:

我对此进行了相当多的搜索,但似乎找不到任何特定于我的问题的内容。

假设我有三个单独的 python 文件 fileA.py、fileB.py 和 fileMain.py

fileB.py 继承自 fileA.py。

文件A.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 中,我有一些代码在父类中的 valueA 更改后调用 Child 类中的 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 完成其他计算。 valueA 应该由程序的用户设置。我在这里简化了一些事情。希望这有意义吗?

抱歉,如果我使用的术语有误。请纠正我。 :)

【问题讨论】:

  • 提示:将self.child = Child()移动到self.parent.valueA = 8下方。
  • @Mr.Zeus 这不会改变任何事情
  • 哎呀,对不起,应该考虑清楚了。
  • 为什么没有任何改变?
  • 文件不继承自文件。这没有任何意义。

标签: python-3.x


【解决方案1】:

您似乎不清楚classesinstances(也称为objects)是如何工作的。

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

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

parent = Parent()
child = Child()

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

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

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

(编辑:顺便说一下,您指的是从 fileA 继承的 fileB 等等。这是对术语的错误使用。一个文件不会从另一个 file继承。你会说一个模块imports来自另一个module。一个类inherits来自另一个class

EDIT2:

如果您的目标是在所有实例之间共享Parentstate,您可以使用Borg 模式。本质上,Borg 的每个实例都与所有其他实例共享其状态。所以如果你做parent1 = Parent()parent2 = Parent(),然后做parent1.valueA = 8,那么parent2.valueA也等于8

它是这样工作的:

class Parent(object): #This is a Borg class
    __shared_state = {}

    def __init__(self):
        self.__dict__ = self.__shared_state
        self.valueA = 5


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

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


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

        self.parent.valueA = 8

        self.child.Calculate()

foobar=MainProgram()

【讨论】:

  • 谢谢指教!因此,如果我有多个类从同一个父类继承 valueA,我必须将新值分别分配给所有子类吗?我希望有一种更有效的方法。
  • 您正在寻找的东西称为 Borg 模式。我将更新我的答案以显示它是如何工作的。就我个人而言,我并没有真正使用过它,所以我不能给你最好的解释为什么它会起作用,但它会解决你遇到的问题。这是一个示例:github.com/faif/python-patterns/blob/master/creational/borg.py。这里有一个你可能会觉得有用的讨论:stackoverflow.com/questions/1318406/…
  • 在 Python 中,everything 是一个对象,甚至是类。所以有类和它们的实例。但是一个对象可能是一个类,一个实例也可能是一个类(例如,所有类都是type的实例)
  • 是的,从技术上讲确实如此。不过,这并不能帮助初学者理解正在发生的事情。在 Python 世界之外object 通常与instance 含义相同(尽管对此存在一些分歧,主要是当人们指向原语时:它们不是任何事物的实例,而是对象;我个人更喜欢参考将它们视为值而不是对象)。无论如何,我只提到一次object,但始终参考instances
猜你喜欢
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 2022-01-05
  • 2013-06-10
  • 1970-01-01
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
相关资源
最近更新 更多