Форум сайта python.su
По следам уже старой статьи на хабре 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'>)
Отредактировано (Авг. 1, 2011 21:34:11)
Офлайн
В данном случае, в A должен быть super, хотя я вопроса не понял.
..bw
Офлайн
Имеется в виду проблема:
Если у нас есть классы 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'>]
Отредактировано (Авг. 2, 2011 10:22:37)
Офлайн
Если наследуетесь от object — используется новый алгоритм. Увидеть (C, A, object, B) — нет шансов. У старого, кстати, __mro__ нет совсем.
Офлайн