ООП 30 Множественное наследование в Python. Multiple inheritance in Python

Поделиться
HTML-код
  • Опубликовано: 31 июл 2020
  • 🔥🔥🔥 Курс на степике по ООП 🔥🔥🔥
    stepik.org/z/114354
    Степик с меня берет комиссию поэтому
    1) Лучший способ приобрести курс - личный банковский перевод в РФ или покупку тарифа на boosty. Я добавлю вас вручную на курс по вашему ид.
    t.me/artem_egoroff
    2) оплачивать напрямую на степике по реферальной ссылке
    stepik.org/z/114354
    так с меня возьмут меньше комиссии
    🚀🚀🚀 Доступ к закрытым видео на один месяц вы можете получить, став спонсором канала
    / @egoroffchannel
    boosty.to/egoroff_channel
    / artem_egorov
    👉👉👉Телеграмм канал моего проекта
    t.me/python_egoroff
    👉👉👉Группа в вк
    python.study
    egoroffartem.pythonanywhere.co...
    Делегирование и функция super
    egoroffartem.pythonanywhere.co...
    Магические методы _iter_ и _next_
    Итерация экземпляров класса Pythone
    Методы экземпляра. Аргумент self
    • ООП 5 Методы экземпляр...
    • ООП 6 Инициализация об...
    Инициализация объекта. Метод init
    Магические методы _getitem_ , _setitem_ и __delitem__. Обращение по индексу к экземпляру
    Object-Oriented Programming (OOP) in Python 3
    egoroffartem.pythonanywhere.co...
    stepik.org/course/63085/promo
    Курс на степике
    Все видео этого курса можете найти на сайте
    egoroffartem.pythonanywhere.co...

Комментарии • 40

  • @egoroffchannel
    @egoroffchannel  26 дней назад

    🔥 Записывайся на курс по ООП: stepik.org/a/114354
    📙 Там тебя ждет:
    ✔ более 180 практических заданий по ООП
    ✔ более 300 тестовых заданий на проверку материала
    ✔ более 6 часов видеоматериала
    ✔ текстовые материалы по урокам, примеры кода
    ✔ Доступ к закрытому чату с дружественной обстановкой
    ✔ Сертификат в случае успешного прохождения курса
    🎁 По промокоду EGOROFF можно получить 10% скидки на приобретение данного курса

  • @user-zf4pm4ky1r
    @user-zf4pm4ky1r 3 года назад +7

    Вы супер! просто и понятно . От чистого сердца я хочу сказать Вам большое спасибо за Ваш труд...👍👍👍

  • @dilfuzaakbaraliyeva5488
    @dilfuzaakbaraliyeva5488 3 года назад +4

    Очень хорошо обесняеш ты лучший я смотрю твои видео в степик ты лучший!!!

  • @user-rw2ig6nb5l
    @user-rw2ig6nb5l 3 года назад

    Большое спасибо, Артем.

  • @mystical_stories
    @mystical_stories 2 года назад

    _Thank you very much!_

  • @alibekjusupov9577
    @alibekjusupov9577 3 года назад

    Спасибо за видео!

  • @user-ir7tc8ky2h
    @user-ir7tc8ky2h Год назад

    Спасибо....доступно, и просто

  • @ArtRaldo
    @ArtRaldo Год назад

    Твои обяснения лучше!

  • @tarassavchenko2317
    @tarassavchenko2317 3 года назад +2

    Как же я за этим соскучился,и тебе привет)

  • @sainco3036
    @sainco3036 3 года назад

    Спасибо.

  • @Faritech318
    @Faritech318 3 года назад

    спасибо

  • @user-cp5oe2jx2g
    @user-cp5oe2jx2g 3 года назад +2

    Если в данной конструкции
    class Person(Builder, Doctor):
    def __init__(self, rank, degree):
    super().__init__(rank)
    Doctor.__init__(self, degree)
    обойтись без - Doctor.__init__(self, degree) и сделать все через super() ?
    на пример вот так :
    class Person(Builder,Doctor):
    def __init__(self,rank,degree):
    super().__init__(rank,degree)
    а в классе Builder также воспользоватьс super() и передать оставшиесяс парметры в следующий оструктор
    class Builder:
    def __init__(self,rank,*args):
    self.rank = rank
    super().__init__(*args)
    на сколько это жижнеспособно на практике?
    Уроки очень хорошие. Спасибо

  • @PAIN153
    @PAIN153 2 года назад +3

    А где 31 урок? почему в плейлисте после 30 идет 32 урок?

    • @PAIN153
      @PAIN153 2 года назад +1

      Ответьте пожалуйста) Я так понимаю 31 урок должен быть подробнее про MRO почему его нигде нет??

  • @user-fc6nr8cr4p
    @user-fc6nr8cr4p 3 года назад +4

    Получается что у нас есть два способа делегирования?:
    1) super().__init__(degree) - при помощи функции super
    2) Builder.__init__(self,rank) - при помощи обращения к необходимому классу

    • @dangerpro1337
      @dangerpro1337 2 года назад

      Именно так

    • @varant7233
      @varant7233 2 года назад +1

      Явно(2 способ) лучше не обращаться, так как иерархия классов может меняться.

  • @user-zk9vn3ko9z
    @user-zk9vn3ko9z 2 года назад

    Артем, привет, можете объяснить результат в следующем коде (ожидаю B A, но получаю B C):
    class A:
    def test(self):
    print("A")
    class B(A):
    def test(self):
    print("B")
    super().test()
    class C(A):
    def test(self):
    print("C")
    class D(B,C):
    def new_test(self):
    print("D")
    obj = D()
    obj.test()
    Заранее спасибо!

    • @egoroffchannel
      @egoroffchannel  2 года назад

      все дело в MRO - method resolution order
      я к сожалению еще не снял про это видео
      coderoad.ru/58702633/Python-MRO-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-super-%D0%B2-%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%BC-%D0%BD%D0%B0%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8

  • @user-cf3zs6fo4k
    @user-cf3zs6fo4k 2 года назад +3

    Эт что получается "super()" не очень то и нужен в принципе? Ведь конструкция ClassName.__init__(self, val1, val2) выглядит как то логичнее и понятнее

    • @heshagrade
      @heshagrade Год назад

      в принципе очень нужен, потому что хардкодить имена классов - это плохая практика

  • @user-ew8yf1ps6m
    @user-ew8yf1ps6m 3 года назад

    Артем, почему мы не передаем self в super().__init__(rank) ? в Doctor.__init__(self, degree) понятно почему передается, а с super() путаюсь. Спасибо

    • @deniskrepak
      @deniskrepak 3 года назад

      В случае с super() Питон сам туда пихает self, а вот вызывая класс Doctor, мы сами должны туда передать эти аргументы

    • @yountdonnette9878
      @yountdonnette9878 2 года назад +2

      This works in Python 2 and 3:
      super(Child, self).__init__()
      This only works in Python 3:
      super().__init__()

  • @user-ov3gf3jn3g
    @user-ov3gf3jn3g 3 года назад

    Пучарм предлагает вместо
    super().__init__(degree)
    Следующую конструкцию:
    super(Person, self).__init__(degree)
    Есть ли в ней какой-то смысл?

    • @vladyslavstadnyk2762
      @vladyslavstadnyk2762 2 года назад

      Насколько я понимаю, это старый стандарт (поправьте меня, кто знает больше), но с какой то версии питона уже можно просто через super().__init__(degree)

  • @user-ir7tc8ky2h
    @user-ir7tc8ky2h Год назад

    2:24 здесь чуть не понятно, а как метод может быть в об'екте ? ...на примере

  • @georgiyshutov
    @georgiyshutov 2 года назад

    Какая цветовая схема у автора ?

  • @oleksandershevchenko8063
    @oleksandershevchenko8063 2 года назад

    Doctor.__init__(self, degree) выглядит не очень изящно. Например, если второй родитель изменится или переименуется, или поменяются порядок наследования, то код перестанет работать. Нельзя ли как то обратится ко второму (и следующим) родителям с помощью super() ?

    • @Manu-ei6tn
      @Manu-ei6tn 2 года назад +1

      Привет. Нашел ответ на свой вопрос? Думаю, многим поможешь)

    • @oleksandershevchenko8063
      @oleksandershevchenko8063 2 года назад +1

      @@Manu-ei6tn Нет, видимо никак. Ркомендуется наследоваться от одного конкретного класса который определяет зависимость "является" и ставится первым, далее лучше ставить абстракные классы - интерфейсы или классы миксины, которые добавляют новые качества объекту но не определяют зависимость "является".

    • @Manu-ei6tn
      @Manu-ei6tn 2 года назад

      @@oleksandershevchenko8063 спасибо и на этом

    • @GreyPPP
      @GreyPPP 2 года назад +1

      @@Manu-ei6tn
      1) как и сказал @Oleksander Shevchenko, лучше делать с наследованием Абстрактные классы или Интерфейсы. Вообще на самом деле лучше избегать множественное наследие и использовать Композицию, но для тестов программы Наследование используется или для для некоторых Паттернов.
      Есть способы решения данной проблемы одни из простых способов это:
      1) задать свой порядок MRO
      2) в метод can_build() класса Doctor добавить super().can_build() - И тогда все будет работать с одним вызовом функции super() ( Если наследник у нас такой Person(Doctor, Builder)). Следует понимать, что мы не можем добавить super().can_build() в метод can_build() класса Builder, так как следующий по MRO класс Object не имеет данной функции.
      3) можно во всех родительских классах добавить super().can_build(), но тогда нужно проверить, на наличие метода в данном классе, это можно сделать c мощью hash hasattr(obj, key) и тогда в два родительских класса, можно добавить супер и выглядеть. например, это будет так:
      def can_build(self):
      if hasattr(super(), 'can_build()'):
      super().can_build()
      - данная проверка убирает ошибку во втором пункте!
      4)Когда, вы используете функцию, super(), то у вас как-бы идет поиск Метода по MRO ( например: super(Person, self).can_build() (лучше так super().can_build) - тут мы делаем поиск данного метода, по порядку MRO начиная от класса Person). Если вы хотите запустить запустить два метода родителей, с помощью супер, но не добавляя, super() к его родителям, то можно в наследники сделать таким образом:
      def can_build(self):
      super().can_build() - тут запустится метод в классе Doctor
      super(Doctor, self).can_build() - тут запустится метод в классе Builder ( тут мы говорим, что хотим запустить данный метод, в следующем по MRO списку класса)
      5) Есть и другие способы, но они более сложные для понимаю, тут я привел более простые

  • @user-wq9go9nc9d
    @user-wq9go9nc9d 3 года назад

    какую расцветку кода ты используэш. я в пайчарме такую не нашел

  • @Sergey-cz7ym
    @Sergey-cz7ym 2 года назад

    Почему пишем super() со скобками, я Doctor без скобок:
    def __init__(self, rank, degree):
    super().__init__(rank)
    Doctor.__init__(self, degree)
    на автомате написал скобки и там и там и минут 20 не мог понять где ошибка 🤯

  • @ValeriiSynenko
    @ValeriiSynenko 2 года назад

    Тоесть у класса: class Person(Builder, Doctor):
    Builder - суперкласс, а Doctor нет?

  • @user-dc8ne4vp7x
    @user-dc8ne4vp7x 2 года назад +1

    Слушай, а где 31 урок?

  • @soup1soup
    @soup1soup 3 года назад

    Зачем вызывать супер, если после супер() вызвал Доктор.__инит__?)) в чем смысл? По логике автора можно было вызвать вместо супер Строитель.__инит__. и ничего бы не поменялось) Запись с явным обозначением родителя не защитит от путаницы, если заменить порядок вызова родителей) Пойду дальше по ютубу поищу

    • @deniskrepak
      @deniskrepak 3 года назад

      Вам никто не запрещает вызывать хоть 100 раз просто по названию профессии. Но super() создан для удобства вызова. Этот код был в качестве примера, чтобы люди понимали откуда идут какие методы.