Python 是否可以将超类变量从子类';方法并在另一个子类中使用它?

Python 是否可以将超类变量从子类';方法并在另一个子类中使用它?,python,python-3.x,inheritance,Python,Python 3.x,Inheritance,编辑:Dou to@Prune comment我编辑了这个问题 我有一个作为超类的主类,并从中扩展了许多类 我想从子类内部的方法更改超类的一个变量,并在另一个子类中使用它 假设: class MainClass: def __init__(self): self.test = 'GOOGLE' # This is a variable def plus(x, y): return x + y class SubClassOne(MainC

编辑:Dou to@Prune comment我编辑了这个问题

我有一个作为超类的主类,并从中扩展了许多类

我想从子类内部的方法更改超类的一个变量,并在另一个子类中使用它

假设:

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-查看超类初始化中的变量
self.test='GOOGLE'

2-然后我在子类substract()中将其更改为
self.test='YAHOO'

3-我在子类2中使用
self.test
,以了解子类的变化

这意味着如果我打印它,我想在输出中
YAHOO
。但实际输出是
GOOGLE


我该怎么办

你无法通过
self获得
YAHOO
作为第二个类的输出。test
类的属性和方法是这样工作的:B继承自A,当你创建一个对象,并尝试执行该对象的方法或类时,它将首先在类A中搜索,然后在类B中搜索,因此,如果它没有在B中重新声明,它将显示A的1,这就是您的情况,属性
self.test
没有在
子类2中重新声明,因此它将
GOOGLE
显示为输出是正常的,您还必须在该子类上重新定义它

您可以使
子类二
继承自
子类
,因为它也将继承覆盖行为:

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

您的设计假设中存在严重缺陷:

3-我在子类2中使用self.test来实现子类的更改

不,你没有。亚类2和亚类1是兄弟亚类<子类2中的code>self.test
指子类2实例的
test
属性;子类群不是这个谱系的任何一部分。子类2仅从MainClass继承。对子类一个实例的
test
属性的更改不能自动影响子类二个实例

在您对旧答案的评论中,我看到了您可能存在的问题:

运行时中的方法是按顺序连续的,先是类1,然后是类2

您声明了两个相互独立的子类,而不是方法
substract()
[sic]和
multiply
是两个不同类的方法。例如,如果您在发布的代码末尾尝试

print(run.substract(5, 2))
您将得到一个运行时错误:
run
没有名为
substract
--
run
的方法属于SubClassTwo类型,它没有这样的方法<代码>减法仅是子类的一种方法



非常简单,您需要确定您希望对象做什么,然后编写相应的Python结构以匹配。由于您没有向我们充分介绍所需的操作,我们无法更改您发布的代码以匹配。简单地设置一个实例属性只需要一个类,而不是三个。

我不能相互继承子类。它们都应该从某个超类继承。@是的,在这个例子中,
子类二
子类二
都从
main类
继承。事实上我不能这样做,因为在实际代码中,假设self.test应该从类一运行,并且它不能在超类中定义。运行时中的方法也是按顺序连续的,先是类1,然后是类Two@adrenalineWest是的,这就是我的意思,在classtwo中重新定义它。你必须从
SubClassTwo
继承
SubClassOne
,这并不能解决潜在的设计问题;您只需重新编写最初的实现特征。您所描述的要么违反了Python语义,要么是一个语法开销太大的过程,这强烈表明您的设计不能正确地满足您的解决方案需求。请编辑您的问题,告诉我们您试图解决的问题。感谢您为我花费的时间。我会更清楚地描述我的问题。我正在使用appium chrome驱动程序运行一个自动化测试。假设我们有一个页面和一个模式窗口以及两个名为btn_A和btn_B的按钮。这里,btn_A在窗口中的模式之外,当然有一个特定的(x,y)坐标。单击btn_B时,不带关闭按钮的模式页面打开。另外,我在webview上下文中,所以btn_A不可单击,所以唯一的方法是在单击btn_B之前获取btn_A的坐标。这是主要问题。获取坐标属于第二类。我们需要你用任何关键信息编辑你的问题,而不是在评论中“隐藏”这些细节。此外,如果您对问题进行了重大更改,则应发布新问题。如果原问题的有效答案被你的澄清无效,那么你应该考虑一个新问题。这是你的判断电话。我已经编辑了这个问题,现在它已经足够清楚了,我想要什么。