Алгоритм объясняется в этой превосходной статье .
Короче говоря,
super(A,self)
ищет в self.__class__.__mro__
следующий класс после A
.
В вашем случае self
- это c
, поэтому self.__class__
- это C
.C.__mro__
- это [C,A,B,object]
.Таким образом, следующий класс в MRO после A
оказывается B
.
Итак, super(A,self)
возвращает объект super
, который ведет себя как B
в отношении поиска атрибутов.
super(A, self).check()
, таким образом, вызывает B.check()
.
Алгоритм C3 , который Python использует для генерации MRO (порядка разрешения методов), также немного более подробно описан это эссе Микеле Симионато.