Множественное наследование и алгоритм MRO в Python

แชร์
ฝัง
  • เผยแพร่เมื่อ 18 ก.ย. 2024

ความคิดเห็น • 21

  • @nikolaym2833
    @nikolaym2833 3 หลายเดือนก่อน

    Обалденный урок, спасибо! Примеры не простейшие, а ровно такие, как надо. Без воды, все четко и по полочкам. Второй раз возвращаюсь сюда

  • @p.polunin
    @p.polunin 6 วันที่ผ่านมา

    Спасибо большое! Повторение, мать учения. Так ясно и лаконично!

  • @romanlegenda6736
    @romanlegenda6736 ปีที่แล้ว +3

    Братан, хорош, давай, давай, вперёд! Контент в кайф, можно ещё? Вообще красавчик! Можно вот этого вот почаще? )

    • @pythonclinic
      @pythonclinic  ปีที่แล้ว +1

      спасибо, всё будет)

  • @Xmike499-
    @Xmike499- 17 วันที่ผ่านมา

    Долгих лет тебе жизни

  • @godgiven994
    @godgiven994 10 หลายเดือนก่อน

    Автор видео - талант, не иначе. Так понятно и наглядно объясняешь. Научиться этому - это одно. Ведь нужно еще сначала разобраться в том, что объяснять. Благодарю за контент и помощь в учебе. Как только одно из твоих видео посмотрел, сразу подписался на канал.

    • @pythonclinic
      @pythonclinic  10 หลายเดือนก่อน

      спасибо за такую высокую оценку)

  • @p.polunin
    @p.polunin 7 หลายเดือนก่อน

    Очень важные вопросы освещаются! Спасибо!

  • @KiryaGkey
    @KiryaGkey 5 หลายเดือนก่อน

    Поставь super().__init__() в класс RunningBird(рекомендуется ставить перед кодом этого инита, чтобы инит спустился в самый низ) т.е. перед self.rn_speed = speed. Получится тоже поведение по mro без привязки конкретного имени класса. Спасибо за видео)

  • @AlexandrKalinovsky
    @AlexandrKalinovsky ปีที่แล้ว +4

    На первый взгляд это очень похоже на нарушение дзен питона - явное лучше чем неявное.

    • @Andrew-xb3nv
      @Andrew-xb3nv ปีที่แล้ว

      Да, некоторые програмисты предпочитают не работать с множественным наследованием.

    • @pythonclinic
      @pythonclinic  ปีที่แล้ว

      дыа, я склонен согласиться с такой формулировкой, тут идея в том, что сам процесс множественного наследования трудно было бы подогнать под этот принцип, иначе пришлось бы тупо все возмодные переходы от дочерних к родительским объектам задавать руками, понятнное дело никто бы так делать не хотел, поэтому имеем упрощение, но неявное

    • @pythonclinic
      @pythonclinic  ปีที่แล้ว

      особенно если до этого они не встречались в ним в других языках

  • @sladge17
    @sladge17 ปีที่แล้ว +1

    Спасибо за видео. Возможно ошибаюсь, но вроде миксины это не классы, поведение которых состоит из нескольких родительских, а родительские классы добавляющие функционал для дочерних. При этом описать поведение Duck при множественном наследовании, можно добавлением метода super в init класса RunningBird с передачей соответствующих параметров.

    • @pythonclinic
      @pythonclinic  ปีที่แล้ว +1

      грань между первым и вторым вариантом очень тонкая на самом деле)

  • @ГубкаБоб-р8ъ
    @ГубкаБоб-р8ъ ปีที่แล้ว +1

    C3-линеаризация действительно страшные слова )))

  • @ВладимирСторожилов-ю1н
    @ВладимирСторожилов-ю1н ปีที่แล้ว

    Доброго времени суток!
    Где можно почитать теорию, которая поможет объяснить следующий кейс со статической переменной?
    class A:
    a = 1
    class B(A):
    pass
    class C(A)
    pass
    print(A.a, B.a, C.a) # 1, 1, 1
    A.a += 1
    print(A.a, B.a, C.a) # 2, 2, 2
    B.a += 1
    print(A.a, B.a, C.a) # 2, 3, 2
    Заранее спасибо!

    • @pythonclinic
      @pythonclinic  ปีที่แล้ว +2

      возьму на себя ответственность пояснить)
      по своей сути это и есть пример работы mro только на линейном случае: пока внутри классов ничего не переопределено они ходят за значением a в самого старшего родителя, после первой "инкрементации" ничего не меняется в этой ситуации кроме самого значения a в классе А, но как только в B происходит "инкрементация", под капотом на самом деле выполняются два действия:
      1) В.а + 1 - здесь мы идём опять по mro, находим значение 2 в А, увеличиваем на 1 и получаем 3
      2) В.а = 3 - вот здесь мы наконец создаём переменную а в В и тем самым перекрываем ею такую же переменную из А, и теперь по нашему mro при обращении B.a ближайшей переменной а окажется именно это свежесозданное значение из самого В, в А больше за ним ходить не нужно
      факторы, которые стоит учитывать:
      - поиск атрибутов ведётся банально по строковому имени, то есть "a" в этом примере
      - "инкрементации" вида N.a += 1 неявно могутт как найти существующее значение в классе N, и увеличить его, так и не найти значение, обратиться за ним к mro, и потом создать это значение в N
      - советую вывести в консоль или посмотреть в дебаге параметры __dict__ у каждого класса после всех "инкрементаций", будет чётко видно, что и где зранится
      почитать могу посоветовать документацию только, в книгах такой глубой теории не встречал, вот есть полный разбор алгоритма mro - www.python.org/download/releases/2.3/mro/ - там стоит версия 2.3, но это актуальный алгоритм, на него есть ссылка из документаций всех версий
      (если крыша после этой статье не отъедет окончательно - можно идти читать исходники)

    • @ВладимирСторожилов-ю1н
      @ВладимирСторожилов-ю1н ปีที่แล้ว

      @@pythonclinic
      Спасибо большое за ответ!

  • @ГубкаБоб-р8ъ
    @ГубкаБоб-р8ъ ปีที่แล้ว

    Использование классов примесей, это же тоже получается множественное наследование?

    • @pythonclinic
      @pythonclinic  ปีที่แล้ว +1

      конечно, примеси или миксины это оно и есть