我发现,我用Python编写的许多类都包含一小部分变量,我在调用str()
时确实希望看到这些变量,而为每个类重写{
class StrMixin(object):
'''
Automatically generate __str__ and __repr__
'''
def __str__(self):
import types
name = self.__class__.__name__ + ': '
attrs = [ '{}={}'.format(k,v) for (k,v) in self.__dict__.items() ]
return name + ', '.join(attrs)
def __repr__(self):
return str(self)
但是,如果我写一个类
^{pr2}$我在实例化时得到以下错误
TypeError: Error when calling the metaclass bases
Cannot create a consistent method resolution
order (MRO) for bases object, StrMixin
当然,这里包括object
是多余的,但是这里到底发生了什么?在
多重继承可能会令人费解。为了在使用mixin时保持简单的继承,可以在类之外定义函数,并在定义时将其分配到类中。在
或者,如果将mixin函数存储在模块中,则可以在类中使用它,如下所示:
^{pr2}$当您定义:
编译器知道在类的MRO中,
StrMixin
在object
之前。在当您这样做时:
^{pr2}$您已经告诉编译器在MRO中,
object
在StrMixin
之前。但是object
也必须在StrMixin
之后,所以它必须在MRO中出现两次,这是不允许的。在如果你说:
那么MRO就是
C
,StrMixin
,object
,它满足两个类所施加的顺序。不存在重复,因为尽管object
被引用了两次,但定义之间没有冲突。在你自己回答了这个问题-第二个
object
是多余的。类C有两个基:object和StrMixin。然而,StrMixin的基也是object,所以它会混淆它应该首先解析哪个对象。MRO将其计算为(C,STRMixin,object,object),其中有重复的对象。在这种特殊情况下,解决方案应该是什么似乎是显而易见的,但是增加几个类,MRO可能变得不那么清晰。E、 gE的MRO是什么?不管它是什么,它真的很复杂,有重复的,可能还有几个循环。在
MRO解释得很好here,您的具体情况在页面下面三分之二处被处理,第一个例子是“Bad Method Resolution Orders”。在
相关问题 更多 >
编程相关推荐