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

Въпрос за 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)