2010-07-04 3 views
6

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

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

+3

Для чего это стоит, у Guido есть блог, в котором он рассказывает нам немного истории python. В недавней статье он рассказывает о Постановлении о разрешении метода: http://python-history.blogspot.com/2010/06/method-resolution-order.html –

ответ

9

Алгоритм объясняется в this excellent article.

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

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

The C3 algorithm Python использует для генерации MRO (метод разрешения порядка) также более подробно описан в статье this essay от Michele Simionato.

+0

+1 за то, что я задержал свои действия четвертого июля с «о, дерьмо Я не могу перестать читать эту статью. – sdolan

+0

О да, моя семья любит это, когда я расскажу им всю историю поиска атрибутов Python, пока мы смотрим большую заставку в небе. – unutbu

Смежные вопросы