Быстрый в изучении - мощный в программировании
>> Telegram ЧАТ для Python Программистов

Свободное общение и помощь советом и решением проблем с кодом! Заходите в наш TELEGRAM ЧАТ!

>> Python Форум Помощи!

Мы создали форум где отвечаем на все вопросы связанные с языком программирования Python. Ждем вас там!

>> Python Канал в Telegram

Обучающие статьи, видео и новости из мира Python. Подпишитесь на наш TELEGRAM КАНАЛ!

Абстрактные методы в Python

Абстрактные методы в Python

Абстрактные методы содержат только определение метода без реализации. Предполагается, что класс-потомок должен переопределить метод и реализовать его функциональность. Чтобы такое предположение сделать более очевидным, часто внутри абстрактного метода возбуждают исключение.

Абстрактные методы

class Class1(object):
    def test(self, x):     # Абстрактный метод
        # Возбуждаем исключение с помощью raise
        raise NotImplementedError("Необходимо переопределить метод")
class Class2(Class1):      # Наследуем абстрактный метод
    def test(self, x):     # Переопределяем метод
        print x
class Class3(Class1):      # Класс не переопределяет метод
    pass
c2 = Class2()
c2.test(50)                # Выведет: 50
c3 = Class3()
try:                       # Перехватываем исключения
    c3.test(50)            # Ошибка. Метод test() не переопределен
except NotImplementedError, msg:
    print msg              # Выведет: Необходимо переопределить метод

Начиная с версии Python 2.6, в состав библиотеки входит модуль abc. В этом модуле определен декоратор @abstractmethod, который позволяет указать, что метод, перед которым расположен декоратор, является абстрактным. При попытке создать экземпляр класса-потомка, в котором не переопределен абстрактный метод, возбуждается исключение TypeErrror. Рассмотрим использование декоратора @abstractmethod на примере.

Использование декоратора @abstractmethod

from abc import ABCMeta, abstractmethod
class Class1(object):
    __metaclass__ = ABCMeta
    @abstractmethod
    def test(self, x):     # Абстрактный метод
        pass
class Class2(Class1):      # Наследуем абстрактный метод
    def test(self, x):     # Переопределяем метод
        print x
class Class3(Class1):      # Класс не переопределяет метод
    pass
c2 = Class2()
c2.test(50)                # Выведет: 50
try:
    c3 = Class3()          # Ошибка. Метод test() не переопределен
    c3.test(50)
except TypeError, msg:
    print msg              # Can't instantiate abstract class Class3
                           # with abstract methods test
Вам нужен качественный и красивый логотип? Советуем вам заказать дизайн логотипов от студии "designcontest.ru". Все по самым доступным ценам!

Комментариев: 3
  1. Второй пример с ABC не рабочий. Даже не знаю, с чем это связано, мб давным давно это был рабочий вариант, но в нынешней версии python, он выдаёт None

  2. Купити терморегулятор для теплої підлоги тут

  3. Владимир | 2021-12-12 в 00:10:40

    Спасибо за примеры, помогли разобраться

Оставьте комментарий!

Используйте нормальные имена.

Имя и сайт используются только при регистрации

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email. При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д., а также подписку на новые комментарии.

(обязательно)