我发现我用
Python编写的许多类包含一小部分变量,我实际上希望在调用str()时看到这些变量,并且为每个变量重写__str __(self)是相当麻烦的.因此,我煮了下面的mixin,
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)
但是,如果我写一堂课,
class C(object,StrMixin): pass
我在实例化时收到以下错误,
TypeError: Error when calling the Metaclass bases Cannot create a consistent method resolution order (MRO) for bases object,StrMixin
当然,包括这里的对象是多余的,但这里到底发生了什么?
解决方法
当你定义:
class StrMixin(object): ...
编译器知道StrMixin位于类的MRO中的对象之前.
当你这样做时:
class C(object,StrMixin): pass
您告诉编译器该对象在MRO中的StrMixin之前出现.但是对象也必须在StrMixin之后,所以它必须在MRO中出现两次,这是不允许的.
如果你说:
class C(StrMixin,object): pass
那么MRO就是C,StrMixin,它满足两个类所强加的排序.没有重复,因为尽管对象被引用两次,但定义之间没有冲突.