#24. Полиморфизм и абстрактные методы | Объектно-ориентированное программирование Python

  Рет қаралды 43,781

selfedu

selfedu

Күн бұрын

Пікірлер: 79
@mir-888
@mir-888 2 ай бұрын
Спасибо, очень понятно, вы лучший! ООП очень Добрый
@Regina_in_youtube
@Regina_in_youtube Жыл бұрын
Сергей, какой же ты отличный учитель! Прекрасный пример для объяснения, легкое и логичное объяснение, чистый звук и т.д. Ты -лучший! 😘😘😘
@andreysperansky3624
@andreysperansky3624 Жыл бұрын
Сергей, спасибо за отличный курс по ООП! Единственное пожелание по данному разделу - добавить про библиотеку "abc", абстрактные классы и декоратор @abstractmethod. Удачи!
@shock3333
@shock3333 4 ай бұрын
Снимаю шляпу, определенно одно из лучших объяснений в русскоязычном ютубе
@jaksonmillka
@jaksonmillka 4 ай бұрын
Урок #24 = Пройден Емае...я просто в шоке. Сколько бы я мог сохранить времени, знав о полиморфизме. Я в своих пет проектах, как только не корявил язык, чтобы он выполнял то что мне нужно. Перерывал весь инет, в поиске решения. А вот оно, решение. ООП мощная штука!
@neuroofun4627
@neuroofun4627 Жыл бұрын
Изучаю Python и программирование в целом больше года уже, и только после простомтра этого видео урока я до конца понял что такое 'полиморфизм' и зачем нужны 'абстрактные методы'. Спасибо большое!!!
@pavelg9855
@pavelg9855 Жыл бұрын
Изучаю Python 4 года, 2.5 из них работаю python-разработчиком, и только после просмотра этого видео я немного понял, что такое "полиморфизм" 😅
@romanbush5164
@romanbush5164 2 жыл бұрын
Благодаря тебе не только освоил ооп, но и интерфейсы наконец то понял что чего)! Спасибо. Полиморфизм мощь
@romanbush5164
@romanbush5164 2 жыл бұрын
Охринеть это работает! Советую всем попробывать и прочувствовать полиморфизм) Инверсия вывода, базовый класс, вызывает внешнюю реализацию, через общий интерфейс class AbstractBaseParent: def __init__(self): self.parent() def parent(self): """вызвать реализацию из дочернего класса""" self.print_test() def print_test(self): """абстрактный метод""" pass class Child(AbstractBaseParent): def __init__(self): """вызвать конструктор родителя""" super().__init__() def print_test(self): print('реализация метода') Child() а можно проще питон автоматически настроен искать полиморфизм) class AbstractBaseParent: def __init__(self): self.print_test() class Child(AbstractBaseParent): def __init__(self): """вызвать конструктор родителя""" super().__init__() def print_test(self): print('реализация метода') Child() или же так class AbstractBaseParent: def __init__(self): self.get_data() self.format() self.validation() self.protect() self.send() def validation(self): print("проверка валидации") def protect(self): print("хиширование информации") def format(self): print("общие правила форматирование") class Db(AbstractBaseParent): def __init__(self): """вызвать конструктор родителя""" super().__init__() def get_data(self): print('получаем данные из базы') def send(self): print("данные сохранены в другой базе") class Api(AbstractBaseParent): def __init__(self): """вызвать конструктор родителя""" super().__init__() def get_data(self): print('получаем данные из json') self.json_serialize() def json_serialize(self): print("этап сериализации") def send(self): print("отправляем данные пользователю") Db() print(" ---- ") Api() получаем данные из базы общие правила форматирование проверка валидации хиширование информации данные сохранены в другой базе ---- получаем данные из json этап сериализации общие правила форматирование проверка валидации хиширование информации отправляем данные пользователю
@CitoFly3
@CitoFly3 9 ай бұрын
Уже которое видео смотрю и каждый раз говорю: "Да этот человек гений!"
@tbassir9076
@tbassir9076 Жыл бұрын
Как всегда респектище! Очень хороший познавательный ролик. Я понимаю Вашу позицию, Вы сначала выдаёте всё по сложному, чтобы напрячь мысли, А в конце выдаёте самый простой и понятный вариант!
@ЛюдмилаБолюнова
@ЛюдмилаБолюнова 9 ай бұрын
Сергей Михайлович, наикрутейшие и наипонятнейшие объяснения в каждом видео! Доходит даже до меня-мамы в декрете! Тысяча благодарностей Вам😁 Пусть все мечты сбываются 💫
@romanbush5164
@romanbush5164 2 жыл бұрын
Охринеть только сейчас находять разработчиком на php, понял всю мощь и крутизну абстрактных классов, когда ты в родительском (абстрактно классе) обьявляешь метод, а уже потомки его реализуют, очень крутой полиморфизм получается!!! )
@АртемЕршов-р9е
@АртемЕршов-р9е 5 ай бұрын
Чувак спасибо тебе за твой труд ! Детально и понятно
@___freedom___
@___freedom___ 2 жыл бұрын
Спасибо, много искал объяснения абстрактных классов, только у вас понял смысл, доступно и понятно!
@РомаГамин
@РомаГамин 2 жыл бұрын
Как же вы подаёте эту музыку! Фантастика! Заседание продолжается, господа присяжные!
@АндрейА-ю3б
@АндрейА-ю3б 2 жыл бұрын
Ваааауу, как доступно! спасибо вам большое!!!
@andredru4278
@andredru4278 10 ай бұрын
Спасибо. Прояснилось понимание полиморфизма.
@Juvelirov-yx8vd
@Juvelirov-yx8vd Жыл бұрын
Учусь на втором курсе на программиста, уже раза 3-4 смотрел лекции про полиморфизм и пытался понять логику концепции. Только сейчас, благодаря тебе, дошло. Спасибо. Примеры кайф
@Arsenator-b3n
@Arsenator-b3n 4 ай бұрын
Спасибо вам сэр Сергей Балакирев, мне сейчас 13 лет , изучаю питон уже 8 месяцев и только сейчас понял что такое полиморфизм
@evi1ive
@evi1ive 2 жыл бұрын
ОООООчень доходчивое объяснение!!!!!!!
@siarheiulas6969
@siarheiulas6969 Жыл бұрын
Спасибо! Очень понятное объяснение. Как всегда.)
@VP-fw3kr
@VP-fw3kr Жыл бұрын
Добрые день, Сергей, большое спасибо за Ваши уроки, сильно выручают, когда начинаю закапываться в теме. Для читающих комментарии хотел предложить чуть другую реализацию, на мой взгляд более удобную, но это кому как: from abc import ABC, abstractmethod class Animal(ABC): @abstractmethod def say(self): pass В чем тут соль, в данном примере мы создаем абстрактный класс Animal, вы спросите: "с какого перепуга он абстрактный то ?". А все потому что мы наследуемся от класса АВС, а абстрактным метод say() делает декоратор @abstractmethod Каковы плюсы данного подхода: 1) Не нужно возбуждать исключение NotImplementedError в абстрактном методе, можно просто поставить pass(заглушку) 2) Интерпретатор сам напомнит вам, что вы не переопределили метод в дочернем классе 3) Также, при попытке создать экземпляр абстрактного класса Animal, будет возбуждено исключение (TypeError: Can't instantiate abstract class Animal with abstract methods move, sound)
@rizef2166
@rizef2166 Жыл бұрын
Не думал что полиморфизм что-то настолько простое, звучит куда страшнее чем есть) Это круто что так легко можно упростить и универсализировать код
@УльянаАкинфина-ь1й
@УльянаАкинфина-ь1й 6 ай бұрын
и всё? и так просто? спасибо большое за такое объяснение!!!!)
@ЮрыйАкулевіч
@ЮрыйАкулевіч 11 ай бұрын
"программа получается корявой, в ней не красоты не гибкости", - это же как надо любить свою работу?! А вообще, браво, маэстро, очень популярно и доходчиво, огромное спасибо!
@АндрейРогозинский-ы1ъ
@АндрейРогозинский-ы1ъ 3 жыл бұрын
Сергей. Михалыч. С наступающим 2022м! От всёй души! От всего сердца! Огромнейший рахмат за ваш благородный труд. Балакиреву Ура! Ура! Ура! Всех с новыи годом.
@Developer_python_
@Developer_python_ Жыл бұрын
Можно было обьяснить за минуту НО подход автора очень крут- уже не забудешь)))
@ACDE34
@ACDE34 Жыл бұрын
Прочитал статью про абстрактные методы на proglib и вообще не понял, для чего они нужны. Вроде бы питон выдаст ошибку и когда метод просто не определен, и когда вызывается абстрактый метод. Новичку вообще не очевидно, чем одна ошибка лучше другой:) А тут все доходчиво объяснено. Спасибо!
@ЕрвандАгаджанян-в3к
@ЕрвандАгаджанян-в3к 2 жыл бұрын
Спасибо! Ты гений!!!
@igorratnik2357
@igorratnik2357 Жыл бұрын
Первым, что пришло в голову при начале обьяснения темы, что методы классов должны иметь одинаковое имя. Кстати в Пайтон появился модуль ABS
@Dayplaylist
@Dayplaylist 2 жыл бұрын
Наконец то дошел до полиморфизма очень хорошее объяснение 😌👍в Джаве помню про абстракцию, но напрочь забыл что это и как это спасибо что напомнил😁😁😁
@aleksandrsemenov1764
@aleksandrsemenov1764 2 жыл бұрын
Отлично поданый материал, спасибо
@andreybelyaev5703
@andreybelyaev5703 3 жыл бұрын
Спасибо! C наступающим!
@jamjam3337
@jamjam3337 Жыл бұрын
спасибо
@romanbush5164
@romanbush5164 2 жыл бұрын
еще крутой полиморфизм это Вызов метода дочернего класса из базового . это вообще отрыв башки)) спустя 2 года узнал)) Хотелось бы побольше узнать о таких крутых фишках , от тебя
@lavron4ik855
@lavron4ik855 Жыл бұрын
Сергей говорил, что это очень нежелательно использовать
@xilagos5727
@xilagos5727 3 жыл бұрын
Серёга, ты красава
@ep1c_play
@ep1c_play 19 сағат бұрын
коротко і зрозуміло
@DimaFyodorov
@DimaFyodorov Ай бұрын
Тек есть же встроенный модуль ABC ? Он если не ошибаюсь позволяет через декораторы выбивать какой метод будет абстрактным, а какой обычным.
@selfedu_rus
@selfedu_rus Ай бұрын
можно и через него
@donfedor007
@donfedor007 2 жыл бұрын
спасибо) круто!
@CultureofSpeech
@CultureofSpeech 9 ай бұрын
А когда ждать продолжение подробнее по этой теме ⁉️
@tagabenz9808
@tagabenz9808 Жыл бұрын
в списке geon , "Rectangle(1,2)" - это указатель на объект класса получается и инициализация уже произошла( вызов метода __init__) в момент определения этого списка тем самым объект уже создан??
@Alukard-789
@Alukard-789 Жыл бұрын
👍👍👍👍👍
@HEKPACOFF
@HEKPACOFF 2 жыл бұрын
Отличная подача, все очень доходчиво. Хочу задать вопрос по по разъяснению реализации класса родителя без реализации, вы назвали его «абстрактным классом», может это больше на «интерфейс» похоже, вроде методы в абстрактных классах могут иметь раилизацию в отличии от интерфейсов. Ещё раз благодарю за вашу работу, ваш канал очень помогает в обучении.
@selfedu_rus
@selfedu_rus 2 жыл бұрын
Спасибо! Терминология везде разная. Интерфейсы есть в Java - там для этого отдельное ключевое слово. В Python все формально называется классами и объектами классов. Поэтому говорить здесь интерфейс думаю будет очень смело )) Но это лишь вопрос теминологии не более того. Суть не меняется.
@TBRAK78
@TBRAK78 Жыл бұрын
@@selfedu_rus Я думаю, что всё же, мы наследуемся, а не имплементируем, так, что это ближе к абстрактному классу, а не интерфейсу(согласен с вами) =)
@orthodox-chanel
@orthodox-chanel 2 жыл бұрын
а как вывести имя дочернего класса в котором произошла ошибка?
@selfedu_rus
@selfedu_rus 2 жыл бұрын
raise NotImplementedError("В дочерний класс: " + str(self.__class__))
@rocker5652
@rocker5652 5 ай бұрын
чет не хватает информации про модуль abc непосредственно для реализации абстрактных классов. а так в целом все доступно, спасибо
@ЮрийТакаев-ч5ы
@ЮрийТакаев-ч5ы 3 жыл бұрын
Спасибо за видео. А как же модуль abc? В нём как раз всё что необходимо для абстрактных классов. Или это будет чуть позже?
@selfedu_rus
@selfedu_rus 3 жыл бұрын
Здесь все же базовый функционал. Модуль abc он лишь имитирует абстракцию, в Python ее нет (такой как в С++ или Java).
@Bah1918
@Bah1918 Жыл бұрын
Спасибо. Очень понятно и доступно . Расскажите, пожалуйста , о модуле ABC и декораторе @abstractmethod.СПАСИБО
@umni_kot
@umni_kot Жыл бұрын
Сергей, а можно ли утверждать (на примере списков), что полиморфизм - это применение метода append к разным отдельным созданным объектам класса list ?
@selfedu_rus
@selfedu_rus Жыл бұрын
Формально полиморфизм, когда есть один интерфейс, работающий с разными типами данных. Метод append подходит под это понятие.
@umni_kot
@umni_kot Жыл бұрын
@@selfedu_rus спасибо
@a_vitalik8891
@a_vitalik8891 4 ай бұрын
Программист: "a = a + 1". Математик: "?!" Программист: "Треугольник со сторонами 1, 2, 3" Математик: "Как скажешь..."
@KonstantinYurievich
@KonstantinYurievich 3 жыл бұрын
👍
@johnbelyaev4031
@johnbelyaev4031 2 жыл бұрын
Сергей здравствуйте! Спасибо за прекрасные уроки. У меня вопрос возник в том моменте когда вы сделали более читабельным код и список geom = [r1,r2,s1,s2,tr1,tr2] переделали в такой вот вид : geom = [Rectangle(7,8),Rectangle(1,2), Square(3),Square(9), Triangle(4,5,8),Triangle(6,6,9)]. Тут в списке уже классы фигурируют а не экземпляры классов? Ничего если их имена два раза повторяются?
@selfedu_rus
@selfedu_rus 2 жыл бұрын
В списке экземпляры классов
@8dimaximym8
@8dimaximym8 Жыл бұрын
Чем больше учу Python после C++, тем больше понимаю, насколько всё криво реализовано в питоне с точки зрения ООП для таких базовых вещей (например, абстрактный метод) чем в других ООП языках *facepalm* Либо же создатели языка намеренно не хотели давать возможность легко создать абстрактный метод/класс с помощью синтаксических средств языка, либо же интерпретируемый язык с динамической типизацией затрудняет это сделать. Хотя лёгкое решение это добавление декоратора @abstractmethod, который как раз генерит исключение. Или те же protected атрибуты, которые буквально ломают важнейший принцип ООП - инкапсуляцию, давая доступ к атрибуту извне. Но не исключаю, что это просто моё столкновение двух разных парадигм, и старая парадигма сопротивляется и поэтому возникает такое ощущение про "кривую реализацию" :)
@takiekakmi7532
@takiekakmi7532 2 жыл бұрын
Хм, чёт теперь не догоняю - нафига подобная реализация вообще нужна в 90% случаев, если можно определить формулу в ините наследника, а функцию в родителе, которая и будет вызывать данную формулу? Это даст расширяемость "из коробки" так сказать... А за объяснение - спасибо) нужно подновлять теорию время от времени)
@selfedu_rus
@selfedu_rus 2 жыл бұрын
В Python полиморфизм, действительно, вшит в сам язык. Его здесь сложно показать.
@flizef6363
@flizef6363 3 жыл бұрын
Здраствуйте, а сколько в будет уроков по ООП на питоне?
@selfedu_rus
@selfedu_rus 3 жыл бұрын
где то 35
@dadyx85
@dadyx85 2 жыл бұрын
Сергей, треугольника со сторонами 1, 2 и 3 не существует 😆
@selfedu_rus
@selfedu_rus 2 жыл бұрын
да, это я дал лиху ))
@dgofman1975
@dgofman1975 2 жыл бұрын
Тут все неправильно, во-первых, полиморфизма в Питоне нет. То что вы написали это переопределение. Вы об этом уже говорили его называют еще (re-implementing a method или Method Overriding). Задача полиморфизма не просто вызвать метод с таким же именем, но и так же послать разные параметры. С и Java такое поддерживает, а вот Питон и Го нет. Плюс то что вы написали это не абстрактные методы, assertion на то что метод должен определится или нет, такое обычно используют для Сингелтонов конструктора. А вот если абстракт то для этого есть @abstractmethod дескриптор
@dgofman1975
@dgofman1975 2 жыл бұрын
en.wikipedia.org/wiki/Polymorphism_(computer_science)
@evan_kirk
@evan_kirk 8 ай бұрын
Насколько я знаю, в Python методы по умолчанию являются виртуальными, то бишь доступными для переопределения.
@selfedu_rus
@selfedu_rus 8 ай бұрын
В Python это не имеет значения, т.к. у нас ссылки (переменные) связаны с конкретным объектом класса и приведение типов здесь отсутствует
@alexanderg9089
@alexanderg9089 2 жыл бұрын
Абстракция реализована в Python на нулевом уровне конечно. Нет ни абстрактных классов, методов, ни интерфейсов. Все на уровне check проверки. Неужели никак нельзя пометить метод обязательным для имплементации в дочерних классах кроме как выбрасывать исключение?
@selfedu_rus
@selfedu_rus 2 жыл бұрын
можно еще через модуль abc импортировать метакласс ABC и декоратор abstractmethod: docs.python.org/3/library/abc.html
@romanbush5164
@romanbush5164 2 жыл бұрын
Более реальный пример когда абстрактный метод, вызывает один конкретный класс, а именно. Интересно можно ли это сделать в питоне 🤔. absract get_data() : self.get_data() (и вызываетя реализация у дочернего класса.
@Edward-y2h
@Edward-y2h 2 жыл бұрын
Разве если абстрактный метод может что то вызывать он остаётся абстрактным? Можно через super(class, instance) вызвать любой класс для данного instance.
@genapak4864
@genapak4864 Ай бұрын
Цирк, у вас итак все абстрактное, абстрактнее некуда, и еще сверху абстрактное, математики, вы плять и так с минусами и все у вас абстрактное.
@gayratsaidakhmedov5451
@gayratsaidakhmedov5451 11 ай бұрын
спасибо
@ibrahimoglu
@ibrahimoglu 3 жыл бұрын
👍
小丑教训坏蛋 #小丑 #天使 #shorts
00:49
好人小丑
Рет қаралды 54 МЛН
Une nouvelle voiture pour Noël 🥹
00:28
Nicocapone
Рет қаралды 9 МЛН
Support each other🤝
00:31
ISSEI / いっせい
Рет қаралды 81 МЛН
Cheerleader Transformation That Left Everyone Speechless! #shorts
00:27
Fabiosa Best Lifehacks
Рет қаралды 16 МЛН
Абстрактные классы в Python
24:35
Станислав [MADTeacher] Чернышев
Рет қаралды 2,5 М.
Первые шаги в ООП: класс, объект, self
1:00:45
Python Russian
Рет қаралды 36 М.
小丑教训坏蛋 #小丑 #天使 #shorts
00:49
好人小丑
Рет қаралды 54 МЛН