Python 3.x Python:更新子类中父类的实例变量
我在这方面搜索了很多,但似乎找不到任何与我的问题相关的东西 假设我有三个单独的python文件fileA.py、fileB.py和fileMain.py fileB.py继承自fileA.py fileA.pyPython 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):
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
相同(尽管在这一点上存在一些分歧,主要是当人们指向原语时:它们不是任何事物的实例,而是对象;我个人更喜欢将它们称为值而不是对象)。无论如何,我只提到了一次对象
,但从头到尾都提到了实例