如何动态添加 mixin 作为基类而不出现 MRO 错误?

2024-04-09

说我有课A, B and C.

Class A and B都是 Class 的 mixin 类C.

class A( object ):
    pass
class B( object ):
    pass
class C( object, A, B ):
    pass

这在实例化 C 类时不起作用。我必须删除object来自 C 类以使其正常工作。 (否则你会遇到 MRO 问题)。

TypeError:调用元类基时出错
无法创建一致的方法解析
碱基 B、对象、A 的顺序 (MRO)

然而,我的情况有点复杂。在我的案例课中C is a server where A and B将是在启动时加载的插件。它们位于它们自己的文件夹中。

我还有一个名为Cfactory。在 Cfactory 我有一个__new__方法将创建一个功能齐全的对象 C. 在__new__方法一search对于插件,使用加载它们__import__,然后将它们分配给C.__bases__ += (loadedClassTypeGoesHere, )

所以以下是一种可能性:(使它变得相当抽象)

class A( object ):
    def __init__( self ): pass
    def printA( self ):   print "A"
class B( object ):
    def __init__( self ): pass
    def printB( self ):   print "B"
class C( object ):
    def __init__( self ):  pass
class Cfactory( object ):
    def __new__( cls ):
        C.__bases__ += ( A, )
        C.__bases__ += ( B, )
        return C()

这又不起作用,并且会再次给出 MRO 错误:

类型错误:无法创建一致的方法解析
基础对象的顺序 (MRO),A

解决此问题的一个简单方法是删除object基类来自A and B。然而,这将使它们成为旧式对象,当这些插件独立运行时应该避免这种对象(这应该是可能的,UnitTest明智的)

另一个简单的修复是删除object from C但这也将使它成为一个老式的类C.__bases__将不可用,因此我无法在其基础上添加额外的对象C

对于这个问题,一个好的架构解决方案是什么?您将如何做这样的事情?现在我可以接受插件本身的旧式类。但我宁愿不使用它们。


可以这样想——你希望 mixin 覆盖一些行为object,所以他们需要先于object按照方法解析顺序。

所以你需要改变碱基的顺序:

class C(A, B, object):
    pass

Due to this bug http://bugs.python.org/issue672115, 你需要C不要直接从对象继承才能正确分配给__bases__,工厂实际上可以只是一个函数:

class FakeBase(object):
    pass

class C(FakeBase):
    pass

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

如何动态添加 mixin 作为基类而不出现 MRO 错误? 的相关文章

随机推荐

  • 所有应用程序在断开连接时崩溃[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 突然之间 当我断开连接 iMac 和 iPhone 的电线时 我构建并发送到手机的任何应用程序都会立即崩溃 并且也没有任
  • 刷新物化视图时,索引是否也会自动刷新?

    我目前使用的是 Postgres 9 3 3 If you refresh物化视图 该物化视图上的索引是否也重新索引 或者是否需要手动重新索引索引 在查看以下内容时question https stackoverflow com quest
  • PHP服务器统计脚本? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我不太确定把这个问题放在哪里 它不是真正的网络应用程序或超级用户 但我确信类似的东西已经存在 我正在寻
  • 在android中使用Google Drive api获取在Google Drive上创建的文件的大小

    我创建了应用程序 使用该应用程序用户将能够从 Google 驱动器获取列表中的所有文件并能够下载它 现在 用户可以下载已上传到驱动器的文件 并带有进度计数 但我无法获取在 Goolge 驱动器上创建的文件的大小 例如文档 演示文稿 电子表格
  • Android UI 测试期间“未找到测试”

    如果我有时想通过右键单击测试然后选择运行来运行单个测试 测试结果将显示 未找到测试 并显示与 线程 main java lang NoClassDefFoundError 中的异常 相关的错误 我发现这种情况只发生过几次 为什么会发生这种情
  • C++迭代器和反向迭代器

    我正在写一个iterator 实际上是const iterator对于我当前的对象 我还想创建一个reverse const iterator also 我环顾四周 想看看如何做到这一点 然后我偶然发现this http www cplus
  • 在jsp页面中使用log4j的正确方法是什么

    我的意思是 我希望记录器名称反映 source jsp 文件 无论它是否包含在另一个文件中或编译为类或其他文件 首先 导入所需的包 即 then the jsppagename jsp根据您使用的服务器 可能会发生变化 然后 在 jsp 内
  • GZip 算法如何工作? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 GZip 文件压缩算法如何工作 如果有人有这方面的任何文档 我想阅读它 如果您仍在寻找更详细的概述 我已经在以下位置编写了 gzip de
  • Django 对象.update_or_create

    我有一个在 celery 中运行的 period task 来查询最新的加密货币价格 但由于某种原因 每次想要显示数据时 我没有得到更新的记录 我只是得到新的记录 而旧的记录由于某种原因被保留 tasks py periodic task
  • NavigationView如何处理动态标题内容

    我有一个非常标准的 NavigationView 当我在标题中使用静态布局 如下所示 时 效果非常好
  • 约束布局 - 具有最大宽度的两个视图

    我想创建一个布局 使用约束布局 如下所示 在不同的语言中 Button1 可能比 Button2 大 我怎样才能做到这一点 我只能在包含两个按钮的约束内使用 LinearLayout 来实现此目的 但我尝试仅使用布局 Thanks Upda
  • 如果主体参数以“@”开头,则发出 PowerShell POST 请求

    我想在 PowerShell 中发出 POST 请求 以下是 Postman 中的正文详细信息 type login username email protected cdn cgi l email protection password
  • 生成数字数组中有效的数字组合

    我正在尝试从数字数组中生成所有有效的数字组合 假设我们有以下内容 let arr 1 2 9 4 7 我们需要输出这样的内容 1 2 9 4 7 1 2 9 47 1 2 94 7 1 2 947 1 29 4 7 1 29 47 1 29
  • 我无法在我的 Visual C Express Edition 2008 中汇编电影 (MMX) 指令

    当我尝试编译时movd指令显示错误为 error A2085 instruction or register not accepted in current CPU mode 我的代码如下 386 model flat c code add
  • 我怎样才能让我的verilog移位器更通用?

    这里我有一个移位器 但现在它最多只能工作 3 位 我一直在寻找 但不知道如何让它工作最多 8 位 module shifter a b out input 7 0 a b output 7 0 out wire 7 0 out1 out2
  • 扩展 Eloquent 的类的构造函数

    我刚刚启动了一个新网站 我想使用 Eloquent 在为数据库播种的过程中 我注意到 如果我在扩展 eloquent 的模型上包含任何类型的构造函数 则会添加空行 例如 运行此播种器
  • 如何解决三向多态关联?

    首先我要说我正在使用 MySQL 不是事务型 并且这是无法更改的 另外 为了简洁和清晰起见 我简化了此处的表格 在此示例中 课程 由其内部属性和外部属性及其自己的属性 阅读 组成 阅读 有其自己的关键依赖属性和三个不同的外部属性 阅读源 我
  • 如何在 SQL Server 2008 中存储特定列的列值?

    基本上我正在映射字段 正如你所看到的GridView 2我选择了特定的列名称 让我们考虑第一条记录 即1 id Column0 For id我已选择Column0 所以在数据库中我想在 id 列下存储列值 1 2 3 4 像下面这样 id
  • 使用属性和不访问 ivars 之间的区别

    使用属性或直接访问 ivars 的特定性能和行为差异 对于全局变量 使用它有什么区别 interface myClass UIImageView myView void loadView super loadView myView UIIm
  • 如何动态添加 mixin 作为基类而不出现 MRO 错误?

    说我有课A B and C Class A and B都是 Class 的 mixin 类C class A object pass class B object pass class C object A B pass 这在实例化 C 类