ООП 30 Множественное наследование в Python. Multiple inheritance in Python
Вставка
- Опубліковано 14 жов 2024
- 🔥🔥🔥 Курс на степике по ООП 🔥🔥🔥
stepik.org/z/1...
Степик с меня берет комиссию поэтому
1) Лучший способ приобрести курс - личный банковский перевод в РФ или покупку тарифа на boosty. Я добавлю вас вручную на курс по вашему ид.
t.me/artem_ego...
2) оплачивать напрямую на степике по реферальной ссылке
stepik.org/z/1...
так с меня возьмут меньше комиссии
🚀🚀🚀 Доступ к закрытым видео на один месяц вы можете получить, став спонсором канала
/ @egoroffchannel
boosty.to/egor...
/ artem_egorov
👉👉👉Телеграмм канал моего проекта
t.me/python_eg...
👉👉👉Группа в вк
python....
egoroffartem.py...
Делегирование и функция super
egoroffartem.py...
Магические методы _iter_ и _next_
Итерация экземпляров класса Pythone
Методы экземпляра. Аргумент self
• ООП 5 Методы экземпляр...
• ООП 6 Инициализация об...
Инициализация объекта. Метод init
Магические методы _getitem_ , _setitem_ и __delitem__. Обращение по индексу к экземпляру
Object-Oriented Programming (OOP) in Python 3
egoroffartem.py...
stepik.org/cou...
Курс на степике
Все видео этого курса можете найти на сайте
egoroffartem.py...
🔥 Записывайся на курс по ООП: stepik.org/a/114354
📙 Там тебя ждет:
✔ более 180 практических заданий по ООП
✔ более 300 тестовых заданий на проверку материала
✔ более 6 часов видеоматериала
✔ текстовые материалы по урокам, примеры кода
✔ Доступ к закрытому чату с дружественной обстановкой
✔ Сертификат в случае успешного прохождения курса
🎁 По промокоду EGOROFF можно получить 10% скидки на приобретение данного курса
Артём, Огромное спасибо!! У вас дар!
Вы супер! просто и понятно . От чистого сердца я хочу сказать Вам большое спасибо за Ваш труд...👍👍👍
Очень хорошо обесняеш ты лучший я смотрю твои видео в степик ты лучший!!!
Как же я за этим соскучился,и тебе привет)
и тебе привет)
_Thank you very much!_
Твои обяснения лучше!
Большое спасибо, Артем.
спасибо
Спасибо....доступно, и просто
Спасибо за видео!
Получается что у нас есть два способа делегирования?:
1) super().__init__(degree) - при помощи функции super
2) Builder.__init__(self,rank) - при помощи обращения к необходимому классу
Именно так
Явно(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)
на сколько это жижнеспособно на практике?
Уроки очень хорошие. Спасибо
А где 31 урок? почему в плейлисте после 30 идет 32 урок?
Ответьте пожалуйста) Я так понимаю 31 урок должен быть подробнее про MRO почему его нигде нет??
Эт что получается "super()" не очень то и нужен в принципе? Ведь конструкция ClassName.__init__(self, val1, val2) выглядит как то логичнее и понятнее
в принципе очень нужен, потому что хардкодить имена классов - это плохая практика
Спасибо.
Артем, привет, можете объяснить результат в следующем коде (ожидаю 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()
Заранее спасибо!
все дело в 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
2:24 здесь чуть не понятно, а как метод может быть в об'екте ? ...на примере
Артем, почему мы не передаем self в super().__init__(rank) ? в Doctor.__init__(self, degree) понятно почему передается, а с super() путаюсь. Спасибо
В случае с super() Питон сам туда пихает self, а вот вызывая класс Doctor, мы сами должны туда передать эти аргументы
This works in Python 2 and 3:
super(Child, self).__init__()
This only works in Python 3:
super().__init__()
Пучарм предлагает вместо
super().__init__(degree)
Следующую конструкцию:
super(Person, self).__init__(degree)
Есть ли в ней какой-то смысл?
Насколько я понимаю, это старый стандарт (поправьте меня, кто знает больше), но с какой то версии питона уже можно просто через super().__init__(degree)
Doctor.__init__(self, degree) выглядит не очень изящно. Например, если второй родитель изменится или переименуется, или поменяются порядок наследования, то код перестанет работать. Нельзя ли как то обратится ко второму (и следующим) родителям с помощью super() ?
Привет. Нашел ответ на свой вопрос? Думаю, многим поможешь)
@@Manu-ei6tn Нет, видимо никак. Ркомендуется наследоваться от одного конкретного класса который определяет зависимость "является" и ставится первым, далее лучше ставить абстракные классы - интерфейсы или классы миксины, которые добавляют новые качества объекту но не определяют зависимость "является".
@@oleksandershevchenko8063 спасибо и на этом
@@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) Есть и другие способы, но они более сложные для понимаю, тут я привел более простые
Какая цветовая схема у автора ?
Почему пишем super() со скобками, я Doctor без скобок:
def __init__(self, rank, degree):
super().__init__(rank)
Doctor.__init__(self, degree)
на автомате написал скобки и там и там и минут 20 не мог понять где ошибка 🤯
какую расцветку кода ты используэш. я в пайчарме такую не нашел
Тоесть у класса: class Person(Builder, Doctor):
Builder - суперкласс, а Doctor нет?
Слушай, а где 31 урок?
Зачем вызывать супер, если после супер() вызвал Доктор.__инит__?)) в чем смысл? По логике автора можно было вызвать вместо супер Строитель.__инит__. и ничего бы не поменялось) Запись с явным обозначением родителя не защитит от путаницы, если заменить порядок вызова родителей) Пойду дальше по ютубу поищу
Вам никто не запрещает вызывать хоть 100 раз просто по названию профессии. Но super() создан для удобства вызова. Этот код был в качестве примера, чтобы люди понимали откуда идут какие методы.
спасибо