Вход | Регистрация

Въпрос за super()

  • Thumbs_up

    Преговарях за контролното и се натъкнах на това:

    class A:
        def x(self):
            print('A')
    
    class B(A):
        def x(self):
            super().x()
            print('B')
    
    class C(A):
        def x(self):
            super().x()
            print('C')
    
    class D(B,C):
        def x(self):
            super().x()
            print('D')
    
    D().x()
    
    # Резултат:
    A
    C
    B
    D

    Нещо не успях да разбера защо получаваме такъв резултат :(

    08.04.2009
  • При наследяване нямаме търсене в дълбочина, а по-скоро в широчина (но е малко по-различно).

    08.04.2009
  • Thumbs_up

    Защото Пайтън е "умен" и първо ще намери най-базовия клас в йерархията и после ще тръгне надолу по наследниците, като ще се погрижи да извика А само един път (усеща се че B и C го наследяват и не вика А.x два пъти)

    08.04.2009
  • Документацията

    Реално можете да си го представите, че super се движи по топологично сортиран път от наследника към родителя. (Осъзнавам, че това звучи леко объркващо...)

    09.04.2009 (променeно 09.04.2009)