看起来我偶然发现了一个地狱级的地狱,即使我不想和它有任何关系.
我正在使用PySide在Qt4中编写应用程序.我想将事件驱动的部分与从Qt Designer文件生成的UI定义分开.因此,我创建了一个"控制器"类,但为了缓解我的生活,无论如何我多次继承它们.一个例子:
class BaseController(QObject):
def setupEvents(self, parent):
self.window = parent
class MainController(BaseController):
pass
class MainWindow(QMainWindow, Ui_MainWindow, MainController):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.setupEvents(self)
Run Code Online (Sandbox Code Playgroud)
这按预期工作.它也有继承自(QDialog,Ui_Dialog,BaseController).但是当我BaseController继承并尝试从所述子类继承(代替BaseController)时,我收到一个错误:
TypeError:调用元类基类元类冲突时出错:派生类的元类必须是其所有基类的元类的(非严格)子类
澄清:这两个QMainWindow和QDialog继承QObject.BaseController由于Qt事件系统的特殊性,它也必须继承它.Ui_类只继承自简单的Python对象类.我搜索了解决方案,但所有这些都涉及故意使用元类的情况.所以我必须做一些非常错误的事情.
编辑:添加图表可能会更清楚我的描述.
工作范例:
QObject
| \___________________
| object |
QMainWindow | BaseController
| /---Ui_MainWindow |
| | MainController
MainWindow-----------------/
Run Code Online (Sandbox Code Playgroud)
另一个工作示例:
QObject
| \___________________
| object |
QDialog | BaseController
| /---Ui_OtherWindow |
| | | …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Python 3 实现一个 Django 数据模型类,它也是一个接口类。我这样做的原因是,我正在为我的同事编写一个基类,并且需要他在所有这些中实现三个方法他从我的派生的类。我试图给他一种简化的方式来使用我设计的系统的功能。但是,他必须重写一些方法来为系统提供足够的信息来执行他继承的类中的代码。
我知道这是错误的,因为它会抛出异常,但我想要一个类似以下示例的类:
from django.db import models
from abc import ABC, abstractmethod
class AlgorithmTemplate(ABC, models.Model):
name = models.CharField(max_length=32)
@abstractmethod
def data_subscriptions(self):
"""
This method returns a list of topics this class will subscribe to using websockets
NOTE: This method MUST be overriden!
:rtype: list
"""
Run Code Online (Sandbox Code Playgroud)
我知道我可以避免继承 ABC类,但我想使用它是因为我不会在这里让你感到厌烦。
在将一个类(如上面的类)包含到我的项目中并运行后,python manage.py makemigrations我收到错误:TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases. …
我正在尝试创建一个抽象基类,它也继承任意 PySide6 类。但是,以下会产生错误TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases。
from abc import ABC, abstractmethod
from PySide6.QtWidgets import QApplication, QWidget
class MyBaseWidget(QWidget, ABC):
def __init__(self, parent=None):
super().__init__(parent=parent)
@abstractmethod
def foo(self):
pass
class MyConcreteWidget(MyBaseWidget):
def __init__(self, parent=None):
super().__init__(parent=parent)
app = QApplication([])
widget = MyConcreteWidget()
widget.show()
app.exec_()
Run Code Online (Sandbox Code Playgroud)
我尝试使用下面看到的解决方案来解决这个问题(灵感来自解决元类冲突,http://www.phyast.pitt.edu/~micheles/python/metatype.html,多重继承元类冲突等)。
class MyMeta(ABCMeta, type(QWidget)): pass
class MyBaseWidget(QWidget, metaclass=MyMeta):
def __init__(self, parent=None):
super().__init__(parent=parent)
@abstractmethod
def …Run Code Online (Sandbox Code Playgroud) 我有两个基本类Foo和Bar,以及一个Worker期望行为类似的类Foo。然后,我添加了另一个实现所有相关属性和方法的类,Foo但是我没有设法通过mypy将其成功传递给静态类型检查。这是一个小例子:
class MyMeta(type):
pass
class Bar(metaclass=MyMeta):
def bar(self):
pass
class Foo:
def __init__(self, x: int):
self.x = x
def foo(self):
pass
class Worker:
def __init__(self, obj: Foo):
self.x = obj.x
Run Code Online (Sandbox Code Playgroud)
这里Worker实际上接受任何Fooish对象,即具有属性x和方法的对象foo。因此,如果obj走路像a一样Foo,如果它像a一样嘎嘎作响,Foo那么Worker它将很高兴。现在,整个项目都使用类型提示,因此暂时指示obj: Foo。到目前为止,一切都很好。
现在有另一个类FooBar,该类具有子类Bar和行为,Foo但不能子类化,Foo因为它通过属性公开其属性(因此__init__参数没有意义):
class FooBar(Bar):
"""Objects of this type are bar and …Run Code Online (Sandbox Code Playgroud)