Вот что-то, относительно чего у меня было сомнение. Рассмотрите следующий отрывок.
class A(object):
def check(self):
super(A, self).check()
print "inside a"
class B(object):
def check(self):
print "inside b"
class C(A, B):
pass
c = C()
c.setup()
Теперь это дает вывод,
inside b
inside a
Передавая это через pdb, я вижу, что при достижении A.setup (), B.setup () называют. Однако вызов от A к методу проверки ее суперкласса; поскольку это не существует перемещения вызова от той точки до B.check ().
Большое спасибо.
Алгоритм объясняется в этой замечательной статье.
Вкратце,
super(A,self)
ищет в self.__class__.__mro__
следующий класс после A
.
В вашем случае self
- это c
, поэтому self.__class__
- это C
.
C.__mro__
is [C,A,B,object]
. Поэтому следующим классом в MRO после A
оказывается B
.
Итак, super(A,self)
возвращает объект super
, который ведет себя как B
в том, что касается поиска атрибутов.
super(A, self).check()
таким образом вызывает B.check()
.
Алгоритм C3, который Python использует для генерации MRO (Method Resolution Order), также описан немного подробнее в этом эссе Микеле Симионато.