У меня есть два вопроса, касающихся метаклассов и множественного наследования. Первый: почему я получаю ошибку TypeError для класса Derived
, но не для Derived2
?
class Metaclass(type): pass
class Klass(object):
__metaclass__ = Metaclass
#class Derived(object, Klass): pass # if I uncomment this, I get a TypeError
class OtherClass(object): pass
class Derived2(OtherClass, Klass): pass # I do not get a TypeError for this
Точное сообщение об ошибке:
TypeError: Error when calling the metaclass bases
Cannot create a consistent method resolution order (MRO) for bases object, Klass
Второй вопрос: Почему в данном случае не работает super
(если я использую __init__
вместо __new__
, снова работает super
):
class Metaclass(type):
def __new__(self, name, bases, dict_):
return super(Metaclass, self).__new__(name, bases, dict_)
class Klass(object):
__metaclass__ = Metaclass
Там я получаю:
TypeError: Error when calling the metaclass bases type.__new__(X):
X is not a type object (str)
Я использую Python 2.6.