Форум сайта python.su
2
class A(object): def say_hello(self): print 'A says hello' class B(A): def say_hello(self): super(B, self).say_hello() print 'B says hello' class C(A): def say_hello(self): super(C, self).say_hello() print 'C says hello' class D(B, C): def say_hello(self): super(D, self).say_hello() print 'D says hello' D().say_hello()
Отредактировано flip89 (Июль 11, 2012 17:33:34)
Офлайн
52
Ваш код работать не будет. Разберитесь, что такое cls и self и зачем они нужны.
print D.__mro__
Офлайн
2
fata1exКод первоначально выложил неправильный, теперь поправил, вопрос остался, что такое cls и self знаю.
Ваш код работать не будет. Разберитесь, что такое cls и self и зачем они нужны.http://stackoverflow.com/questions/1848474/method-resolution-order-mro-in-new-style-python-classesprint D.__mro__
Офлайн
52
flip89Приведённые ссылка и код - это не моя подпись на форуме. Они адресованы вам в ответ на вопрос. Если она вам не нравится, можете попробовать выбрать любую по запросу ‘python mro’ в любимом поисковике.
вопрос остался
Офлайн
2
Про mro я тоже в курсе, спасибо. Вопрос в том почему метод в С отрабатывает раньше метода в В, да и почему он собственно вообще отрабатывает, ведь этот метод сперва ищется в В и раз он существует то как до метода в С вообще доходит дело?
Офлайн
173
flip89По MRO и доходит. Так понятнее будет:
как до метода в С вообще доходит дело?
class A(object): def say_hello(self): print 'A says hello' class B(A): def say_hello(self): print 'B says hello' super(B, self).say_hello() print 'B super' class C(A): def say_hello(self): print 'C says hello' super(C, self).say_hello() print 'C super' class D(B, C): def say_hello(self): print 'D says hello' super(D, self).say_hello() print 'D super' print D.__mro__ D().say_hello()
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>) D says hello B says hello C says hello A says hello C super B super D super
Офлайн
2
А разве после того как интерпретатор нашел метод в В он не должен закончить дальнейший поиск?
Офлайн
173
flip89Вы же явно вызываете метод из базового класса.
А разве после того как интерпретатор нашел метод в В он не должен закончить дальнейший поиск?
Офлайн
2
Точно! Все понятно. Большое спасибо!:)
Офлайн