Уведомления

Группа в Telegram: @pythonsu

#1 Июль 11, 2012 17:08:34

flip89
От:
Зарегистрирован: 2011-10-21
Сообщения: 28
Репутация: +  2  -
Профиль   Отправить e-mail  

Наследование методов

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
В чем я не прав?



Отредактировано flip89 (Июль 11, 2012 17:33:34)

Офлайн

#2 Июль 11, 2012 17:28:50

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Наследование методов

Ваш код работать не будет. Разберитесь, что такое cls и self и зачем они нужны.

print D.__mro__
http://stackoverflow.com/questions/1848474/method-resolution-order-mro-in-new-style-python-classes



Офлайн

#3 Июль 11, 2012 17:34:56

flip89
От:
Зарегистрирован: 2011-10-21
Сообщения: 28
Репутация: +  2  -
Профиль   Отправить e-mail  

Наследование методов

fata1ex
Ваш код работать не будет. Разберитесь, что такое cls и self и зачем они нужны.

print D.__mro__
http://stackoverflow.com/questions/1848474/method-resolution-order-mro-in-new-style-python-classes
Код первоначально выложил неправильный, теперь поправил, вопрос остался, что такое cls и self знаю.



Офлайн

#4 Июль 11, 2012 17:38:29

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Наследование методов

flip89
вопрос остался
Приведённые ссылка и код - это не моя подпись на форуме. Они адресованы вам в ответ на вопрос. Если она вам не нравится, можете попробовать выбрать любую по запросу ‘python mro’ в любимом поисковике.

Например, эту.



Офлайн

#5 Июль 11, 2012 17:45:12

flip89
От:
Зарегистрирован: 2011-10-21
Сообщения: 28
Репутация: +  2  -
Профиль   Отправить e-mail  

Наследование методов

Про mro я тоже в курсе, спасибо. Вопрос в том почему метод в С отрабатывает раньше метода в В, да и почему он собственно вообще отрабатывает, ведь этот метод сперва ищется в В и раз он существует то как до метода в С вообще доходит дело?



Офлайн

#6 Июль 11, 2012 18:08:03

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Наследование методов

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.

Офлайн

#7 Июль 11, 2012 19:20:35

flip89
От:
Зарегистрирован: 2011-10-21
Сообщения: 28
Репутация: +  2  -
Профиль   Отправить e-mail  

Наследование методов

А разве после того как интерпретатор нашел метод в В он не должен закончить дальнейший поиск?



Офлайн

#8 Июль 11, 2012 19:47:13

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Наследование методов

flip89
А разве после того как интерпретатор нашел метод в В он не должен закончить дальнейший поиск?
Вы же явно вызываете метод из базового класса.

Офлайн

#9 Июль 11, 2012 20:09:54

flip89
От:
Зарегистрирован: 2011-10-21
Сообщения: 28
Репутация: +  2  -
Профиль   Отправить e-mail  

Наследование методов

Точно! Все понятно. Большое спасибо!:)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version