我对此进行了很多搜索,但似乎找不到与我的问题有关的任何东西。
说我有三个单独的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应该由程序的用户设置。我在这里简化了事情。希望这有意义吗?
对不起,如果我使用的术语错误。请纠正我。 :)
答案 0 :(得分:1)
您似乎不清楚classes
和instances
(也称为objects
)的工作方式。
Parent
,Child
和MainProgram
为classes
。您可以将它们视为蓝图。他们不变。
实例化一个类时,您会得到一个instance
,例如:
parent = Parent()
child = Child()
parent
和child
是实例。调用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实例与所有其他实例共享其状态。因此,如果您先进行Parent
和parent1 = Parent()
,然后再进行parent2 = Parent()
,那么parent1.valueA = 8
也将等于parent2.valueA
。
它是这样的:
8