Найти - Пользователи
Полная версия: Наследование методов
Начало » Python для новичков » Наследование методов
1
flip89
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()  
Есть такой код. Дает такой вывод:
A says hello
C says hello
B says hello
D says hello
Объясните, пожалуйста, как код отрабатывает? По-моему представлению в классах нового стиля он должен запускать метод в D, затем исполнять super и запускать метод в B, там исполнять super и запускать метод в A. Исполнив метод в А дополнять его методом в В, затем дополнять методом в D. В итоге вывод должен быть:
A says hello
B says hello
D says hello
В чем я не прав?
fata1ex
Ваш код работать не будет. Разберитесь, что такое cls и self и зачем они нужны.

print D.__mro__
http://stackoverflow.com/questions/1848474/method-resolution-order-mro-in-new-style-python-classes
flip89
fata1ex
Ваш код работать не будет. Разберитесь, что такое cls и self и зачем они нужны.

print D.__mro__
http://stackoverflow.com/questions/1848474/method-resolution-order-mro-in-new-style-python-classes
Код первоначально выложил неправильный, теперь поправил, вопрос остался, что такое cls и self знаю.
fata1ex
flip89
вопрос остался
Приведённые ссылка и код - это не моя подпись на форуме. Они адресованы вам в ответ на вопрос. Если она вам не нравится, можете попробовать выбрать любую по запросу ‘python mro’ в любимом поисковике.

Например, эту.
flip89
Про mro я тоже в курсе, спасибо. Вопрос в том почему метод в С отрабатывает раньше метода в В, да и почему он собственно вообще отрабатывает, ведь этот метод сперва ищется в В и раз он существует то как до метода в С вообще доходит дело?
reclosedev
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
Как раз в порядке MRO.
flip89
А разве после того как интерпретатор нашел метод в В он не должен закончить дальнейший поиск?
reclosedev
flip89
А разве после того как интерпретатор нашел метод в В он не должен закончить дальнейший поиск?
Вы же явно вызываете метод из базового класса.
flip89
Точно! Все понятно. Большое спасибо!:)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB