Ошибка порядка разрешения метода
-
12-12-2019 - |
Вопрос
Это скорее вопрос любопытства, а не серьезный вопрос:
Я экспериментировал с множественным наследованием и наткнулся на следующее:
>>> 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.В данном случае невозможно удовлетворить обе эти гарантии.
Вот аналогичный вопрос
Питон:Проблема с метаклассами в сочетании с множественным наследованием