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