python 如何在一组兄弟类中修改同一个方法?

aiazj4mn  于 2023-02-07  发布在  Python
关注(0)|答案(3)|浏览(130)

我有两个类(Table和Button)继承自同一个类Widget。这两个子类都有自己的keyEvent()方法,并且在必要时都调用Widget.keyEvent()。我想以相同的方式修改这两个类的keyEvent()行为(例如,使AD键触发LEFTRIGHT键)。
这段代码完全按照我的要求工作

class KeyModifier:
    def keyEvent():
        # some lines of code
        super().keyEvent()

class MyTable(KeyModifier,Table):
    pass

class MyButton(KeyModifier,Button):
    pass

但是Pylance很生气,因为KeyModifier.super()没有任何keyEvent()方法(这是真的)。
有没有办法做得更好?还有,我希望Pylance在使用KeyModifier时警告我一些不是从Widget继承的东西。
这个例子来自一个PyQT应用程序,但问题更一般。
Edit:让KeyModifier成为Widget的子类使得KeyModifier.super().keyEvent()调用Widget.keyEvent(),我想调用子类方法(Table.keyEvent()或Button.keyEvent())

izj3ouym

izj3ouym1#

有用吗?

from abc import abstractmethod

class Table:
    pass

class Button:
    pass

class KeyModifier:
    @abstractmethod
    def custom_operation(self):
        pass

    def key_event(self, condition):
        if condition:
            self.custom_operation()

class MyTable(KeyModifier, Table):
    def __init__(self):
        super(MyTable, self).__init__()

    def custom_operation(self):
        pass

class MyButton(KeyModifier, Button):
    def custom_operation(self):
        pass
1qczuiv0

1qczuiv02#

如果你让KeyModifier继承自Widget,警告就不会出现,因为keyEvent实际上是为对象定义的。如果你也添加super().keyEvent()调用到你修改过的类中,所有正确的事件都会被触发,这要归功于MRO-方法解析顺序。

class Base:
    def event(self):
        print("Base")

class A(Base):
    def event(self):
        print("A")

class B(Base):
    def event(self):
        print("B")

class Modifier(Base):
    def event(self):
        print("Modified")
        super().event()

class ModifiedA(Modifier, A):
    def event(self):
        print("ModifiedA")
        super().event()

class ModifiedB(Modifier, B):
    def event(self):
        print("ModifiedB")
        super().event()

ModifiedA().event()

输出:

ModifiedA
Modified
A

值得注意的是,如果AB不调用它们自己的super(我相当肯定PyQt小部件确实调用它们的父类),Modifier必须是第一个继承的类,因为这将导致它成为MRO中的第一个类,并有机会依次调用其他类的方法。

pdtvr36n

pdtvr36n3#

我已经找到了一个变通办法,因为我实际上不必管理任何类方法,但要处理的事件。

def KeyModifier(event: Event) -> Event:
    # some lines of code and edit 'event' if necessary
    return event

class MyButton(Button):
    def keyEvent(self, event: Event):
        super().keyEvent(KeyModifier(event))

我觉得这是最简单的写法,谢谢大家的建议:)

相关问题