我有两个类(Table和Button)继承自同一个类Widget。这两个子类都有自己的keyEvent()方法,并且在必要时都调用Widget.keyEvent()。我想以相同的方式修改这两个类的keyEvent()行为(例如,使A
和D
键触发LEFT
和RIGHT
键)。
这段代码完全按照我的要求工作
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())
3条答案
按热度按时间izj3ouym1#
有用吗?
1qczuiv02#
如果你让
KeyModifier
继承自Widget
,警告就不会出现,因为keyEvent
实际上是为对象定义的。如果你也添加super().keyEvent()
调用到你修改过的类中,所有正确的事件都会被触发,这要归功于MRO-方法解析顺序。输出:
值得注意的是,如果
A
和B
不调用它们自己的super(我相当肯定PyQt小部件确实调用它们的父类),Modifier
必须是第一个继承的类,因为这将导致它成为MRO中的第一个类,并有机会依次调用其他类的方法。pdtvr36n3#
我已经找到了一个变通办法,因为我实际上不必管理任何类方法,但要处理的事件。
我觉得这是最简单的写法,谢谢大家的建议:)