Вопрос

Это скорее вопрос любопытства, а не серьезный вопрос:

Я экспериментировал с множественным наследованием и наткнулся на следующее:

>>> class A(object):
...     def __init__(self): print "A.__init__() called"
...
>>> class B(object, A): pass
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Cannot create consisten method resolution
order (MRO) for bases object, A

я получаю TypeError.Однако, когда я меняю порядок множественного наследования:

>>> class B(A, object): pass
>>> b = B()
A.__init__() called

Он работает нормально.Я предположил, что в первую очередь наследование object до A создает некоторую двусмысленность имени.Кто-нибудь хочет объяснить, что здесь происходит?

Это было полезно?

Решение

A унаследован от object или подкласс object, это не работает.MRO гарантирует, что самые левые базы посещаются раньше самых правых, но он также гарантирует, что среди предков, если x является подклассом y, то x посещается раньше y.В данном случае невозможно удовлетворить обе эти гарантии.

Вот аналогичный вопрос

Питон:Проблема с метаклассами в сочетании с множественным наследованием

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top