В пределах одной иерархии классов метаклассы должны быть подклассами друг друга.То есть метакласс Component
должен быть подклассом метакласса OtherObjects
.
Если вы не назовете __metaclass__
для Component
, то по умолчанию будет использоваться метакласс OtherObjects
.
Если ComponentMetaClass
и OtherObjectsMeta
оба наследуют (независимо) от type
:
class OtherObjectsMeta(type): pass
class ComponentMetaClass(type): pass
class OtherObjects(object):
__metaclass__ = OtherObjectsMeta
class Component(OtherObjects):
__metaclass__ = ComponentMetaClass
, тогда вы получите эту ошибку:
TypeError: Error when calling the metaclass bases
metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
, но если вы сделаете ComponentMetaClass
в качестве подкласса OtherObjectsMeta
class ComponentMetaClass(OtherObjectsMeta): pass
тогда ошибка исчезнет.
Возможно, я неправильно понял ваш вопрос.Если хотите ComponentMetaClass.__new__
для вызова OtherObjectsMeta.__new__
, то используйте super
:
class OtherObjectsMeta(type):
def __new__(meta, name, bases, dct):
print('OtherObjectsMeta')
return super(OtherObjectsMeta,meta).__new__(meta,name,bases,dct)
class ComponentMetaClass(OtherObjectsMeta):
def __new__(meta, name, bases, dct):
print('ComponentMetaClass')
return super(ComponentMetaClass,meta).__new__(meta,name,bases,dct)
Относительно альтернативы использованию метаклассов, упомянутых в комментариях.Используйте super
:
class Base(object):
def method(self): pass
class Base1(Base):
def method(self):
print('Base1')
super(Base1,self).method()
class Base2(Base):
def method(self):
print('Base2')
super(Base2,self).method()
class Component(Base1,Base2):
pass
c = Component()
c.method()