Найти - Пользователи
Полная версия: Порядок разрешения методов
Начало » Python для экспертов » Порядок разрешения методов
1
pyOut
По следам уже старой статьи на хабре http://habrahabr.ru/blogs/python/62203/ хотел бы для себя прояснить некоторые моменты, в которых не получилось разобраться.

Версия Python 2.6. В статье пишется что после версии 2.2 Проблема должна возникнуть в ромбовитой структуре.

...class A(object):
... def __init__(self):
... print "A"
...
>>> class B(object):
... def __init__(self):
... print "B"
...
>>> class C(A, B):
... pass
...
>>> C.__mro__
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <type 'object'>)
но у меня как видите линеаризации получилась не такой как предполагалось, т.е. я не вижу проблемы ромбовитой структуры

т.е. C - > A - > object -> B

почему? Или я не правильно понял статью?
bw
В данном случае, в A должен быть super, хотя я вопроса не понял.

..bw
pyOut
Имеется в виду проблема:
Если у нас есть классы A и B, от которых наследуется класс C, то при поиске метода по старому алгоритму (C, A, object, B) получается, что если метод не определён в классах C и A он будет извлечён из object, даже если он определён в B. Это создаёт определённые неудобства, т.к. в object определены многие магические методы, типа __init__, __str__ и т.п. Но даже если object заменить на некий пользовательский класс D, то проблема останется — менее специфичный метод класса-предка может отработать вместо более специфичного метода класса-потомка.
Даже если использовать super все равно mro ставит object в самый конец линеаризации, а не как описано (C, A, object, B)
>>> class A(object):
... def __init__(self):
... print "A"
... super(A, self).__init__()
...
>>> class B(object):
... def __init__(self):
... print "B"
... super(B, self).__init__()
...
>>> class C(A,B):
... pass
...
>>> c = C()
A
B
>>> C.mro()
[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <type 'object'>]
Андрей Светлов
Если наследуетесь от object — используется новый алгоритм. Увидеть (C, A, object, B) — нет шансов. У старого, кстати, __mro__ нет совсем.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB