三重继承会导致元类冲突......有时

2024-02-14

看起来我偶然发现了一个元类地狱,即使我不想与之有任何关系。

我正在使用 PySide 在 Qt4 中编写一个应用程序。我想将事件驱动部分与 UI 定义分开,UI 定义是从 Qt Designer 文件生成的。因此,我创建了一个“控制器”类,但为了减轻我的生活,我无论如何都多重继承它们。一个例子:

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)

这按预期工作。它还继承自 (QDialog, Ui_Dialog, BaseController)。但是当我子类化时BaseController并尝试从所述子类继承(代替BaseController),我收到一个错误:

TypeError:调用元类基时出错 元类冲突:派生类的元类必须是其所有基类的元类的(非严格)子类

澄清:两者都有QMainWindow and QDialog继承自QObject. BaseController由于 Qt 事件系统的特殊性,也必须继承它。 Ui_ 类仅继承自简单的 Python 对象类。我寻找解决方案,但所有解决方案都涉及有意使用元类的情况。所以我一定做错了什么。

编辑:通过添加图表我的描述可能会更清楚。

工作示例:

QObject
|      \___________________
|            object        |
QMainWindow     |          BaseController
|      /---Ui_MainWindow   |
|      |                   MainController
MainWindow-----------------/

另一个工作示例:

QObject
|      \___________________
|            object        |
QDialog         |          BaseController
|      /---Ui_OtherWindow  |
|      |                   |
OtherWindow----------------/

不工作示例:

QObject
|      \___________________
|            object        |
QDialog         |          BaseController
|      /---Ui_OtherWindow  |
|      |                   OtherController
OtherWindow----------------/

该错误消息表明您的层次结构中的某个位置有两个冲突的元类。您需要检查每个类和 QT 类以找出冲突所在。

下面是一些设置相同情况的简单示例代码:

class MetaA(type):
    pass
class MetaB(type):
    pass
class A:
    __metaclass__ = MetaA
class B:
    __metaclass__ = MetaB

我们不能直接子类化这两个类,因为 python 不知道要使用哪个元类:

>>> class Broken(A, B): pass
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Error when calling the metaclass bases
  metaclass conflict: the metaclass of a derived class must be a (non-strict)
  subclass of the metaclasses of all its bases

该错误试图告诉我们的是,我们需要通过引入第三个元类来解决两个元类之间的冲突,该第三个元类是基类中所有元类的子类。

我不确定这比错误消息本身更清楚,但基本上,您可以通过这样做来修复它:

class MetaAB(MetaA, MetaB):
    pass

class Fixed(A, B):
    __metaclass__ = MetaAB

此代码现在可以正确编译并运行。当然,在实际情况下,您的冲突解决元类必须决定采用哪些父元类行为,您必须根据应用程序的要求自行确定哪些行为。

请记住,您继承的类只会获得one两个元类的。__init__方法,有时会完成所有工作,因此在很多情况下,您必须添加一个__init__以某种方式召唤双方,帮助他们相处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

三重继承会导致元类冲突......有时 的相关文章

随机推荐

  • 使用 EF 4.1 将父记录和多个子记录作为单个“工作单元”插入

    我正在练习一组代码优先的类 它们之间具有父子关系 public class Parent public int Id get set public string Name get set public List
  • 在 ejb3 中使用数据传输对象是否被认为是最佳实践

    虽然显然单个设计无法涵盖所有 场景 但现在是否普遍认为 ORM 类应该在表示层和业务层 本地或远程 之间来回传递 从而取代对数据传输对象的需求 据我所知 使用 ORM 类带来了不必要的急切加载 上下文管理问题和紧密耦合的问题 但也节省了大量
  • python27 errno 0 和 2 在简单的 for 循环打印中

    我只是使用 python27 在一个简单的 for 循环中打印变量 可以打印出部分结果 但是在输出过程中突然停止 并出现errno 0和2 描述为IOerror 我对这个错误感到非常困惑 这是我的简单代码 def checkPrint fo
  • touchesEnded:withEvent:如何解决触发前的延迟

    在 iPhone OS 上 touchesEnded withEvent 当您离开手指时会快速触发 除非有拖动 如果 touchesMoved withEvent 已触发 则在获得 TouchesEnded withEvent 之前大约有
  • 文本旁边的垂直对齐按钮中间

    我试图将按钮垂直对齐到中间 以便它更适合文本 我尝试过 center block 和 text center 但没有任何运气 我想要一个通用的解决方案 这样我就不会硬编码边距 填充等 这是我的小提琴 http jsfiddle net jh
  • 如何进行选择性 Mongo 恢复?

    假设我有一个Mongo具有两个数据库的副本集 一个主数据库和几个辅助数据库 db1 and db2 中学一所Mongo崩溃并丢失数据 现在当这个Mongo重新启动就会recover并复制both db1 and db2从初级开始 由于这样的
  • 如何在 matlab 中检索函数参数的名称?

    除了解析函数文件之外 还有没有办法获取matlab中函数的输入和输出参数的名称 例如 给定以下函数文件 divide m function value remain divide left right value floor left ri
  • Apple 在应用程序配置中“无法添加卡”

    我正在实施苹果应用程序内配置 并且遵循苹果指南中的所有步骤 但最后 我收到一条消息 无法添加卡 但没有任何错误抛出此过程 这就是我的创作方式PKAddPaymentPassViewController let cardInfoPass PK
  • 重新发送请求角度2

    在 Angular 2 应用程序中 每个对 API 的请求都有带有令牌的标头 以防令牌过期 API 会使用 401 http 代码进行响应 我有一种更新令牌的方法 但是在获取新令牌的过程中如何重新发送先前的请求以暂停其他请求 您可以延长Ht
  • googlemock - 模拟返回复杂数据类型的方法

    我想模拟一个返回复杂数据类型的方法 class aClass public virtual const QMap
  • 使用 jQuery 查找子项的索引?

    如果我有一个像这样的 html 结构 div div class child first div class sub child div div div class child second div class sub child div
  • 如何在SQL Server中查找包含TAB字符的字段

    在 SQL Server 中 识别表中某一列包含以下内容的所有行的最佳方法是什么 TAB特点 CHAR 9 是不是这么简单 SELECT FROM MyTable WHERE Field1 LIKE CHAR 9 RTRIMCHAR 列 像
  • ServiceConnection.onServiceConnected() 和 startService()

    我有一个非常简单的活动 public class MainActivity extends Activity private Intent serviceIntent public MainService mainService publi
  • 我可以在 Ruby on Rails 上编写 PostgreSQL 函数吗?

    我们正在启动一个基于 Ruby on Rails 的项目 我们曾经使用 Perl 和 PostgreSQL 函数 以及 Rails 和 Active Record 我还没有看到我们应该如何在 PostgreSQL 中创建函数并使用 Acti
  • PHP HTML 显示按钮属性

    我希望能够从按钮中获取尽可能多的属性来显示 按钮
  • 如何从存储在列表中的对象中获取特定字段值的列表?

    假设我有一个包含两个字段的对象列表field1 and field2 都是String类型 我如何获得所有的列表field1如果可能的话 无需迭代列表即可值 幸运的是 您可以使用以下方法来做到这一点Java 8 流 https www tu
  • 如何使用Goutte获取元描述内容

    您能帮我找到一种使用 Goutte 从元描述 元关键字和机器人内容中获取内容的方法吗 另外 我该如何定位 and
  • 如何在 prisma 管理的 postgresql 数据库上创建触发器?

    晚上好 我正在使用nodejs prisma postgresql 开发一个聊天应用程序 我希望在特定聊天中创建最后一条消息后 24 小时内立即从 postgresql 数据库中删除 为此 我创建了一个触发器 function creati
  • 累积的使用

    我正在解决一个问题 我使用cumulatives 2 3 谓词 但是当我尝试将其与minimize in labeling 我有以下演示 10 个任务 全部持续时间为 1 4 台机器 全部容量 1 我的目标是尽量减少总时间 即minimiz
  • 三重继承会导致元类冲突......有时

    看起来我偶然发现了一个元类地狱 即使我不想与之有任何关系 我正在使用 PySide 在 Qt4 中编写一个应用程序 我想将事件驱动部分与 UI 定义分开 UI 定义是从 Qt Designer 文件生成的 因此 我创建了一个 控制器 类 但