【发布时间】:2019-03-26 16:47:02
【问题描述】:
我想创建派生自 PyQt5 QtWidget.QWidget 和 abc.ABCMeta 的类。这两个类都有自己的元类作为类型,因此,根据this page 和this SO question,我需要创建自己的元类,它派生自QWidget 和abc.ABCMeta 的元类,并明确将其用作我的班级的元类。
到目前为止一切顺利,我已经定义了一个QtAbcMeta 类并将其用作metaclass 用于我的ConcreteWidget 类(见下文)。
import abc
from PyQt5 import QtWidgets, QtCore
class AbstractClass(metaclass=abc.ABCMeta):
def __init__(self, name):
self._name = name
@abc.abstractmethod
def myMethod():
pass
class QtAbcMeta(type(QtWidgets.QWidget), type(AbstractClass)):
pass
class ConcreteWidget(QtWidgets.QWidget, AbstractClass, metaclass=QtAbcMeta):
def __init__(self, name, parent=None):
AbstractClass.__init__(self, name)
QtWidgets.QWidget.__init__(self, parent=parent) # This gives a type error.
def myMethod():
print("My widget does something")
def main():
app = QtWidgets.QApplication([])
myWidget = ConcreteWidget('my name', parent=None)
if __name__ == "__main__":
main()
但是,当我尝试调用QtWidgets.QWidget 方法的__init__ 方法来设置父级时,我得到以下TypeError:
Traceback (most recent call last):
File "main.py", line 36, in <module>
main()
File "main.py", line 33, in main
myWidget = ConcreteWidget('my name', parent=None)
File "main.py", line 24, in __init__
QtWidgets.QWidget.__init__(self, parent=parent) # This gives a type error.
TypeError: __init__() missing 1 required positional argument: 'name'
我不知道这里出了什么问题。 QtWidgets.QWidget.__init__ 的签名是否发生了某种变化?任何帮助将不胜感激。
【问题讨论】:
-
AbstractClass.__init__(self, name)的目的是什么?AbstractClass实例未保存在ConcreteWidget中的任何位置。 -
在这个 MVCE 中,
AbstractClass.__init__(self, name)行确实什么都不做。在我的实际用例中,ConcreteWidget继承自一些ConcreteClass,而后者又继承自AbstractClass。ConcreteClass的__init__方法需要name参数。
标签: python pyqt pyqt5 metaclass