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

Поділитися
Вставка
  • Опубліковано 25 лис 2024

КОМЕНТАРІ • 75

  • @shock3333
    @shock3333 3 місяці тому +3

    Снимаю шляпу, определенно одно из лучших объяснений в русскоязычном ютубе

  • @andreysperansky3624
    @andreysperansky3624 Рік тому +18

    Сергей, спасибо за отличный курс по ООП! Единственное пожелание по данному разделу - добавить про библиотеку "abc", абстрактные классы и декоратор @abstractmethod. Удачи!

  • @Regina_in_youtube
    @Regina_in_youtube Рік тому +9

    Сергей, какой же ты отличный учитель! Прекрасный пример для объяснения, легкое и логичное объяснение, чистый звук и т.д. Ты -лучший! 😘😘😘

  • @mir-888
    @mir-888 25 днів тому +1

    Спасибо, очень понятно, вы лучший! ООП очень Добрый

  • @CitoFly3
    @CitoFly3 7 місяців тому +4

    Уже которое видео смотрю и каждый раз говорю: "Да этот человек гений!"

  • @romanbush5164
    @romanbush5164 2 роки тому +4

    Охринеть это работает! Советую всем попробывать и прочувствовать полиморфизм) Инверсия вывода, базовый класс, вызывает внешнюю реализацию, через общий интерфейс
    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
    этап сериализации
    общие правила форматирование
    проверка валидации
    хиширование информации
    отправляем данные пользователю

  • @romanbush5164
    @romanbush5164 2 роки тому +7

    Охринеть только сейчас находять разработчиком на php, понял всю мощь и крутизну абстрактных классов, когда ты в родительском (абстрактно классе) обьявляешь метод, а уже потомки его реализуют, очень крутой полиморфизм получается!!! )

  • @debirtv8267
    @debirtv8267 2 місяці тому

    Спасибо вам сэр Сергей Балакирев, мне сейчас 13 лет , изучаю питон уже 8 месяцев и только сейчас понял что такое полиморфизм

  • @neuroofun4627
    @neuroofun4627 Рік тому +8

    Изучаю Python и программирование в целом больше года уже, и только после простомтра этого видео урока я до конца понял что такое 'полиморфизм' и зачем нужны 'абстрактные методы'.
    Спасибо большое!!!

    • @pavelg9855
      @pavelg9855 Рік тому +1

      Изучаю Python 4 года, 2.5 из них работаю python-разработчиком, и только после просмотра этого видео я немного понял, что такое "полиморфизм" 😅

  • @ЮрыйАкулевіч
    @ЮрыйАкулевіч 9 місяців тому +8

    "программа получается корявой, в ней не красоты не гибкости", - это же как надо любить свою работу?! А вообще, браво, маэстро, очень популярно и доходчиво, огромное спасибо!

  • @АртемЕршов-р9е
    @АртемЕршов-р9е 3 місяці тому +1

    Чувак спасибо тебе за твой труд ! Детально и понятно

  • @romanbush5164
    @romanbush5164 2 роки тому +9

    Благодаря тебе не только освоил ооп, но и интерфейсы наконец то понял что чего)! Спасибо. Полиморфизм мощь

  • @ЛюдмилаБолюнова
    @ЛюдмилаБолюнова 7 місяців тому +1

    Сергей Михайлович, наикрутейшие и наипонятнейшие объяснения в каждом видео! Доходит даже до меня-мамы в декрете! Тысяча благодарностей Вам😁 Пусть все мечты сбываются 💫

  • @Juvelirov-yx8vd
    @Juvelirov-yx8vd Рік тому +1

    Учусь на втором курсе на программиста, уже раза 3-4 смотрел лекции про полиморфизм и пытался понять логику концепции. Только сейчас, благодаря тебе, дошло. Спасибо. Примеры кайф

  • @rizef2166
    @rizef2166 Рік тому +1

    Не думал что полиморфизм что-то настолько простое, звучит куда страшнее чем есть) Это круто что так легко можно упростить и универсализировать код

  • @ACDE34
    @ACDE34 Рік тому +1

    Прочитал статью про абстрактные методы на proglib и вообще не понял, для чего они нужны. Вроде бы питон выдаст ошибку и когда метод просто не определен, и когда вызывается абстрактый метод. Новичку вообще не очевидно, чем одна ошибка лучше другой:) А тут все доходчиво объяснено. Спасибо!

  • @tbassir9076
    @tbassir9076 Рік тому +2

    Как всегда респектище! Очень хороший познавательный ролик. Я понимаю Вашу позицию, Вы сначала выдаёте всё по сложному, чтобы напрячь мысли, А в конце выдаёте самый простой и понятный вариант!

  • @VP-fw3kr
    @VP-fw3kr Рік тому +2

    Добрые день, Сергей, большое спасибо за Ваши уроки, сильно выручают, когда начинаю закапываться в теме.
    Для читающих комментарии хотел предложить чуть другую реализацию, на мой взгляд более удобную, но это кому как:
    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)

  • @АндрейРогозинский-ы1ъ

    Сергей. Михалыч. С наступающим 2022м!
    От всёй души! От всего сердца! Огромнейший рахмат за ваш благородный труд.
    Балакиреву Ура! Ура! Ура!
    Всех с новыи годом.

  • @Developer_python_
    @Developer_python_ Рік тому +1

    Можно было обьяснить за минуту НО подход автора очень крут- уже не забудешь)))

  • @andredru4278
    @andredru4278 8 місяців тому +1

    Спасибо. Прояснилось понимание полиморфизма.

  • @УльянаАкинфина-ь1й
    @УльянаАкинфина-ь1й 4 місяці тому +1

    и всё? и так просто? спасибо большое за такое объяснение!!!!)

  • @jaksonmillka
    @jaksonmillka 2 місяці тому

    Урок #24 = Пройден
    Емае...я просто в шоке. Сколько бы я мог сохранить времени, знав о полиморфизме. Я в своих пет проектах, как только не корявил язык, чтобы он выполнял то что мне нужно. Перерывал весь инет, в поиске решения. А вот оно, решение. ООП мощная штука!

  • @РомаГамин
    @РомаГамин 2 роки тому +1

    Как же вы подаёте эту музыку! Фантастика! Заседание продолжается, господа присяжные!

  • @___freedom___
    @___freedom___ Рік тому +2

    Спасибо, много искал объяснения абстрактных классов, только у вас понял смысл, доступно и понятно!

  • @АндрейА-ю3б
    @АндрейА-ю3б 2 роки тому +3

    Ваааауу, как доступно! спасибо вам большое!!!

  • @igorratnik2357
    @igorratnik2357 Рік тому +2

    Первым, что пришло в голову при начале обьяснения темы, что методы классов должны иметь одинаковое имя. Кстати в Пайтон появился модуль ABS

  • @siarheiulas6969
    @siarheiulas6969 Рік тому +2

    Спасибо! Очень понятное объяснение. Как всегда.)

  • @evi1ive
    @evi1ive 2 роки тому +2

    ОООООчень доходчивое объяснение!!!!!!!

  • @ЕрвандАгаджанян-в3к

    Спасибо! Ты гений!!!

  • @jamjam3337
    @jamjam3337 Рік тому +2

    спасибо

  • @romanbush5164
    @romanbush5164 2 роки тому +5

    еще крутой полиморфизм это Вызов метода дочернего класса из базового . это вообще отрыв башки)) спустя 2 года узнал)) Хотелось бы побольше узнать о таких крутых фишках , от тебя

    • @lavron4ik855
      @lavron4ik855 Рік тому

      Сергей говорил, что это очень нежелательно использовать

  • @Dayplaylist
    @Dayplaylist 2 роки тому +1

    Наконец то дошел до полиморфизма очень хорошее объяснение 😌👍в Джаве помню про абстракцию, но напрочь забыл что это и как это спасибо что напомнил😁😁😁

  • @aleksandrsemenov1764
    @aleksandrsemenov1764 2 роки тому +1

    Отлично поданый материал, спасибо

  • @xilagos5727
    @xilagos5727 2 роки тому +1

    Серёга, ты красава

  • @andreybelyaev5703
    @andreybelyaev5703 2 роки тому +1

    Спасибо! C наступающим!

  • @CultureofSpeech
    @CultureofSpeech 7 місяців тому +1

    А когда ждать продолжение подробнее по этой теме ⁉️

  • @donfedor007
    @donfedor007 2 роки тому +1

    спасибо) круто!

  • @Anonim-im6ln
    @Anonim-im6ln Рік тому +2

    👍👍👍👍👍

  • @a_vitalik8891
    @a_vitalik8891 3 місяці тому +1

    Программист: "a = a + 1".
    Математик: "?!"
    Программист: "Треугольник со сторонами 1, 2, 3"
    Математик: "Как скажешь..."

  • @rocker5652
    @rocker5652 3 місяці тому +1

    чет не хватает информации про модуль abc непосредственно для реализации абстрактных классов. а так в целом все доступно, спасибо

  • @ЮрийТакаев-ч5ы
    @ЮрийТакаев-ч5ы 2 роки тому +6

    Спасибо за видео. А как же модуль abc? В нём как раз всё что необходимо для абстрактных классов. Или это будет чуть позже?

    • @selfedu_rus
      @selfedu_rus  2 роки тому +1

      Здесь все же базовый функционал. Модуль abc он лишь имитирует абстракцию, в Python ее нет (такой как в С++ или Java).

  • @tagabenz9808
    @tagabenz9808 10 місяців тому +1

    в списке geon , "Rectangle(1,2)" - это указатель на объект класса получается и инициализация уже произошла( вызов метода __init__) в момент определения этого списка тем самым объект уже создан??

  • @Bah1918
    @Bah1918 Рік тому +1

    Спасибо. Очень понятно и доступно . Расскажите, пожалуйста , о модуле ABC и декораторе @abstractmethod.СПАСИБО

  • @umni_kot
    @umni_kot Рік тому +2

    Сергей, а можно ли утверждать (на примере списков), что полиморфизм - это применение метода append к разным отдельным созданным объектам класса list ?

    • @selfedu_rus
      @selfedu_rus  Рік тому +1

      Формально полиморфизм, когда есть один интерфейс, работающий с разными типами данных. Метод append подходит под это понятие.

    • @umni_kot
      @umni_kot Рік тому

      @@selfedu_rus спасибо

  • @HEKPACOFF
    @HEKPACOFF 2 роки тому +1

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

    • @selfedu_rus
      @selfedu_rus  2 роки тому

      Спасибо! Терминология везде разная. Интерфейсы есть в Java - там для этого отдельное ключевое слово. В Python все формально называется классами и объектами классов. Поэтому говорить здесь интерфейс думаю будет очень смело )) Но это лишь вопрос теминологии не более того. Суть не меняется.

    • @TBRAK78
      @TBRAK78 Рік тому

      @@selfedu_rus Я думаю, что всё же, мы наследуемся, а не имплементируем, так, что это ближе к абстрактному классу, а не интерфейсу(согласен с вами) =)

  • @8dimaximym8
    @8dimaximym8 Рік тому +1

    Чем больше учу Python после C++, тем больше понимаю, насколько всё криво реализовано в питоне с точки зрения ООП для таких базовых вещей (например, абстрактный метод) чем в других ООП языках *facepalm*
    Либо же создатели языка намеренно не хотели давать возможность легко создать абстрактный метод/класс с помощью синтаксических средств языка, либо же интерпретируемый язык с динамической типизацией затрудняет это сделать. Хотя лёгкое решение это добавление декоратора @abstractmethod, который как раз генерит исключение.
    Или те же protected атрибуты, которые буквально ломают важнейший принцип ООП - инкапсуляцию, давая доступ к атрибуту извне.
    Но не исключаю, что это просто моё столкновение двух разных парадигм, и старая парадигма сопротивляется и поэтому возникает такое ощущение про "кривую реализацию" :)

  • @KonstantinYurievich
    @KonstantinYurievich 2 роки тому +1

    👍

  • @orthodox-chanel
    @orthodox-chanel Рік тому +2

    а как вывести имя дочернего класса в котором произошла ошибка?

    • @selfedu_rus
      @selfedu_rus  Рік тому +1

      raise NotImplementedError("В дочерний класс: " + str(self.__class__))

  • @johnbelyaev4031
    @johnbelyaev4031 2 роки тому +1

    Сергей здравствуйте! Спасибо за прекрасные уроки. У меня вопрос возник в том моменте когда вы сделали более читабельным код и список 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 роки тому +4

      В списке экземпляры классов

  • @takiekakmi7532
    @takiekakmi7532 2 роки тому +1

    Хм, чёт теперь не догоняю - нафига подобная реализация вообще нужна в 90% случаев, если можно определить формулу в ините наследника, а функцию в родителе, которая и будет вызывать данную формулу? Это даст расширяемость "из коробки" так сказать...
    А за объяснение - спасибо) нужно подновлять теорию время от времени)

    • @selfedu_rus
      @selfedu_rus  2 роки тому

      В Python полиморфизм, действительно, вшит в сам язык. Его здесь сложно показать.

  • @flizef6363
    @flizef6363 2 роки тому +1

    Здраствуйте, а сколько в будет уроков по ООП на питоне?

  • @dadyx85
    @dadyx85 2 роки тому +3

    Сергей, треугольника со сторонами 1, 2 и 3 не существует 😆

    • @selfedu_rus
      @selfedu_rus  2 роки тому +2

      да, это я дал лиху ))

  • @evan_kirk
    @evan_kirk 6 місяців тому +1

    Насколько я знаю, в Python методы по умолчанию являются виртуальными, то бишь доступными для переопределения.

    • @selfedu_rus
      @selfedu_rus  6 місяців тому

      В Python это не имеет значения, т.к. у нас ссылки (переменные) связаны с конкретным объектом класса и приведение типов здесь отсутствует

  • @dgofman1975
    @dgofman1975 2 роки тому +1

    Тут все неправильно, во-первых, полиморфизма в Питоне нет. То что вы написали это переопределение. Вы об этом уже говорили его называют еще (re-implementing a method или Method Overriding). Задача полиморфизма не просто вызвать метод с таким же именем, но и так же послать разные параметры. С и Java такое поддерживает, а вот Питон и Го нет.
    Плюс то что вы написали это не абстрактные методы, assertion на то что метод должен определится или нет, такое обычно используют для Сингелтонов конструктора. А вот если абстракт то для этого есть @abstractmethod дескриптор

    • @dgofman1975
      @dgofman1975 2 роки тому

      en.wikipedia.org/wiki/Polymorphism_(computer_science)

  • @alexanderg9089
    @alexanderg9089 2 роки тому +1

    Абстракция реализована в Python на нулевом уровне конечно. Нет ни абстрактных классов, методов, ни интерфейсов. Все на уровне check проверки. Неужели никак нельзя пометить метод обязательным для имплементации в дочерних классах кроме как выбрасывать исключение?

    • @selfedu_rus
      @selfedu_rus  2 роки тому +1

      можно еще через модуль abc импортировать метакласс ABC и декоратор abstractmethod: docs.python.org/3/library/abc.html

  • @romanbush5164
    @romanbush5164 2 роки тому +2

    Более реальный пример когда абстрактный метод, вызывает один конкретный класс, а именно. Интересно можно ли это сделать в питоне 🤔. absract get_data() :
    self.get_data() (и вызываетя реализация у дочернего класса.

    • @Edward-y2h
      @Edward-y2h 2 роки тому

      Разве если абстрактный метод может что то вызывать он остаётся абстрактным? Можно через super(class, instance) вызвать любой класс для данного instance.

  • @gayratsaidakhmedov5451
    @gayratsaidakhmedov5451 9 місяців тому +1

    спасибо

  • @ibrahimoglu
    @ibrahimoglu 2 роки тому +1

    👍