假设我有一堂课A
,B
并且C
。
ClassA
和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
是一个服务器,其中A
并且B
将是在启动时加载的插件。这些都驻留在自己的文件夹中。
我还有一个名为Cfactory
. 在 Cfactory 中,我有一个__new__
方法可以创建一个功能齐全的对象 C。在该__new__
方法中,我搜索插件,使用 加载它们__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 错误:
TypeError:无法
为基础对象 A 创建一致的方法解析顺序 (MRO)
一个简单的解决方法是object
从A
和中删除基类B
。然而,这将使它们成为旧式对象,当这些插件独立运行时应该避免使用这些对象(这应该是可能的,UnitTest 明智的)
另一个简单的解决方法是从中删除object
,C
但这也会使其成为旧式类并且C.__bases__
将不可用,因此我无法将额外的对象添加到C
什么是一个好的架构解决方案,你将如何做这样的事情?现在我可以忍受插件本身的旧式类。但我宁愿不使用它们。