【发布时间】:2021-09-19 02:05:18
【问题描述】:
from abc import ABC, abstractmethod
from PyQt5.QtWidgets import QMainWindow
class _ControlGUI(QMainWindow, ABC):
pass
上面非常简单的代码引发了一个我不太清楚的错误。
TypeError: 元类冲突:派生类的元类必须 是其所有基类的元类的(非严格)子类
我的目标是定义一个具有强制结构/属性的基类_ControlGUI;然后定义多个继承自它的具体类,并具有额外的功能/属性。所有这些具体类都是小的 GUI,因此继承自 QMainWindow,因此我认为最好让抽象类直接从 QMainWindow 继承。但是,这似乎是不可能的。
什么是最好的设计,解决这个问题?我目前的想法是定义没有QMainWindow 的抽象类,并让所有具体类继承自_ControlGUI 和QMainWindow。
【问题讨论】:
-
这是元类的问题;他们写得不好。
_ControlGUI的子类也不能从QMainWindow继承;这是QMainWindow使用的元类与ABCMeta冲突。 -
据我所知,唯一的解决方案是不使用
ABC,而是依靠子类来实现记录为需要重写的方法。 -
还有一个事实是 PyQt 类并不总是与多重继承很好地混合在一起,因此必须格外小心,尤其是在处理构造函数中的参数时。请参阅 this 和 this。如果您能提供一个基本的minimal reproducible example 来说明您正在努力实现的目标,我们或许能够更好地了解问题出在哪里,看看是否还有其他可能性。
-
您可以定义
class YourMetaClass(type(QMainWindow), type(ABC)):pass然后在class _ControlGUI(QMainWindow, ABC, metaclass=YourMetaClass):中指定。 Maybe this will help -
@JulianFock 我给了你一个答案。看起来它运作良好!随意输入它作为这个问题的完整答案。
标签: python python-3.x pyqt5 metaclass abc