Ой парадигма в Python

Вот что-то, относительно чего у меня было сомнение. Рассмотрите следующий отрывок.

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 ().

  1. Кто-то мог объяснить или указать на меня на документ, который объясняет, как это работает внутренне? Я could'nt нахожу любого.
  2. Кто-то мог показать мне подобную реализацию в C++ / Java? Я думаю, сравнивая его с другими языками, помог бы мне понять проблему под рукой лучше.

Большое спасибо.

6
задан 5 July 2010 в 16:03
поделиться

1 ответ

Алгоритм объясняется в этой замечательной статье.

Вкратце,

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), также описан немного подробнее в этом эссе Микеле Симионато.

9
ответ дан 10 December 2019 в 02:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: