Парадигма ООП в Python - PullRequest
6 голосов
/ 04 июля 2010

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

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. Может ли кто-нибудь объяснить или указать мне документ, который объясняет, как это работает внутри?Я не смог найти ничего.
  2. Может кто-нибудь показать мне подобную реализацию в C ++ / Java?Я думаю, что сравнение с другими языками поможет мне лучше понять проблему.

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

1 Ответ

9 голосов
/ 04 июля 2010

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

Короче говоря,

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...