Python 3.x Python:更新子类中父类的实例变量

Python 3.x Python:更新子类中父类的实例变量,python-3.x,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):

我在这方面搜索了很多,但似乎找不到任何与我的问题相关的东西

假设我有三个单独的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中,我有一些代码,在父类中的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应该由程序的用户设置。我简化了这里的事情。希望这有意义


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

您似乎不清楚
实例
(也称为
对象
)是如何工作的

Parent
Child
MainProgram
。你可以把它们想象成蓝图。它们不会改变

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

parent = Parent()
child = Child()
parent
child
是实例。调用
parent.valueA=8
时,您正在更改名为
parent
实例上的值

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

有关更多信息,请考虑阅读以下内容:

(编辑:顺便说一句,您指的是从fileA继承的fileB等等。这是一个不正确的术语用法。文件不是从另一个文件继承的。您可以说模块是从另一个模块导入的。类是从另一个类继承的)

编辑2:

如果您的目标是在其所有实例之间共享
父对象的
状态
,则可以使用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()

提示:将
self.child=child()
移动到不会改变任何东西的
self.parent.valueA=8
@Mr.Zeus下方。哎呀,对不起,我应该仔细考虑一下。为什么这不会改变任何东西?文件不会从文件继承。那没有任何意义。谢谢你的启发!因此,如果有多个类从同一父类继承valueA,我必须将新值分别分配给所有子类?我希望会有一个更有效的方法。你正在寻找的是所谓的博格模式。我将更新我的答案以显示它是如何工作的。就我个人而言,我还没有真正使用过它,所以我不能给你最好的解释为什么它会工作,但它会解决你的问题。下面是一个例子:。下面是一个您可能会发现很有用的讨论:在Python中,所有东西都是对象,甚至是类。所以有类和它们的实例。但是一个对象可能是一个类,一个实例也可能是一个类(例如,所有类都是
类型的实例)是的,当然,从技术上讲,这是正确的。但这并不能帮助初学者理解正在发生的事情。在Python世界之外,
object
通常意味着与
instance
相同(尽管在这一点上存在一些分歧,主要是当人们指向原语时:它们不是任何事物的实例,而是对象;我个人更喜欢将它们称为值而不是对象)。无论如何,我只提到了一次
对象
,但从头到尾都提到了
实例