编辑: Dou to@Prune comment我已经编辑了问题
我有一个主类作为超类,并有许多从它扩展而来的类。
我想从子类内部的方法更改superclass的一个变量,并在另一个子类中使用它。
假设:
class MainClass:
def __init__(self):
self.test = 'GOOGLE' # This is a variable
def plus(x, y):
return x + y
class SubClassOne(MainClass):
def __init__(self):
super().__init__()
def substract(self, x, y):
return x + y
self.test = 'YAHOO' # Here I'm trying to change the 'test'
class SubClassTwo(MainClass):
def __init__(self):
super().__init__()
def multiply(self, x, y):
print(self.test) # Here I'm printing the 'test' and I want to have it with 'YAHOO' value
return x * y
run = SubClassTwo()
run.multiply(2,5)
1-查看SuperClass初始化中的变量self.test = 'GOOGLE'
。
2-然后我在SubClassOne.substract((中将其更改为self.test = 'YAHOO'
。
3-我在SubClassTwo中使用self.test
来实现对SubClassOne的更改。
意味着如果我打印它,我希望输出中有YAHOO
。但实际输出是GOOGLE
我该怎么办?
您的设计假设中存在一个关键缺陷:
3-我在SubClassTwo中使用self.test来获取SubClassOne的更改。
不,你没有。SubClassTwo和SubClassOne是同级子类。SubClassTwo中的self.test
是指一个SubClassTwe实例的test
属性;SubClassOne不是这个谱系的任何一部分。SubClassTwo仅从MainClass继承。对SubClassOne实例的test
属性的更改不能自动影响SubClassTwo实例。
在你对旧答案的评论中,我看到了你的问题:
运行时的方法按顺序是连续的,ClassOne然后ClassTwo
您声明了两个子类,它们彼此独立,而不是方法。substract()
[sic]和multiply
是两个不同类的方法。例如,你是否在发布代码的末尾尝试
print(run.substract(5, 2))
您会得到一个运行时错误:run
没有名为substract
的方法——run
的类型是SubClassTwo,它没有这样的方法。substract
只是SubClassOne的一个方法。
非常简单,您需要确定您希望对象做什么,然后编写相应的Python结构来匹配。由于您没有告诉我们足够的关于您想要的操作,我们无法更改您发布的代码以匹配。简单地设置一个实例属性只需要一个类,而不需要三个。
你不能得到YAHOO
作为第二个类的self.test
的输出,类的属性和方法都是这样工作的:B继承自A,当你创建一个对象,并且你试图执行该对象的方法或类时,它会先在类A中搜索,然后在B中搜索,所以如果它没有在B中重新声明,它会显示A的一个,这就是你的情况,属性self.test
没有在SubClassTwo
中重新声明,因此它将显示GOOGLE
作为输出是正常的,您必须在该子类上重新定义它,也就是
您可以使SubClassTwo
从SubClassOne
继承,因为它也将继承覆盖行为:
class SubClassTwo(SubClassOne):
def multiply(self, x, y):
print(self.test) # prints "YAHOO"
return x * y