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

preview_player
Показать описание

Что такое полиморфизм и пример его реализации в Python. Есть ли абстрактные методы в Python и как можно реализовать подобный им функционал.

Рекомендации по теме
Комментарии
Автор

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

shock
Автор

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

Regina_in_youtube
Автор

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

andreysperansky
Автор

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

CitoFly
Автор

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

romanbush
Автор

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

mir-
Автор

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

neuroofun
Автор

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

debirtv
Автор

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

romanbush
Автор

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

rizef
Автор

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

romanbush
Автор

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

ЛюдмилаБолюнова
Автор

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

Juvelirov-yxvd
Автор

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

ACDE
Автор

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

ЮрыйАкулевіч
Автор

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

tbassir
Автор

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

АндрейРогозинский-ыъ
Автор

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

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)

VP-fwkr
Автор

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

РомаГамин
Автор

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

Developer_python_