是否可以从子类的方法中更改超类变量并将其用于另一个子类?



编辑: 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作为输出是正常的,您必须在该子类上重新定义它,也就是

您可以使SubClassTwoSubClassOne继承,因为它也将继承覆盖行为:

class SubClassTwo(SubClassOne):
def multiply(self, x, y):
print(self.test)  # prints "YAHOO"
return x * y

最新更新