Как в Python реализовать интерфейс или абстрактный класс

Ответ

В Python для создания интерфейсов и абстрактных классов используется модуль abc (Abstract Base Classes).

Абстрактный класс — это класс, который не может иметь экземпляров и предназначен для наследования. Он определяет "контракт": набор методов, которые должны быть реализованы в дочерних классах.

Ключевые элементы:

  • ABC: Метакласс, от которого нужно унаследовать свой абстрактный класс.
  • @abstractmethod: Декоратор, который помечает метод как абстрактный. Дочерний класс обязан переопределить этот метод.

Пример

Создадим интерфейс Transport, который требует реализации метода move().

from abc import ABC, abstractmethod

# 1. Определяем абстрактный класс (интерфейс)
class Transport(ABC):

    @abstractmethod
    def move(self):
        """Этот метод должен быть реализован всеми подклассами."""
        pass

# 2. Реализуем интерфейс в конкретных классах
class Car(Transport):
    def move(self):
        print("Автомобиль едет по дороге")

class Boat(Transport):
    def move(self):
        print("Лодка плывет по воде")

# 3. Использование
car = Car()
boat = Boat()

car.move()  # Вывод: Автомобиль едет по дороге
boat.move() # Вывод: Лодка плывет по воде

# Попытка создать экземпляр без реализации метода вызовет ошибку
try:
    class Plane(Transport):
        pass
    cessna = Plane()
except TypeError as e:
    print(f"nОшибка: {e}")
    # Вывод: Ошибка: Can't instantiate abstract class Plane with abstract method move

Этот механизм обеспечивает полиморфизм и гарантирует, что все объекты, реализующие интерфейс, будут иметь одинаковый набор методов, что делает код более предсказуемым и надежным.

Ответ 18+ 🔞

Давай разберем эту тему про абстрактные классы в Python, но без занудства, а как есть, по-человечьи.

Вот представь: ты архитектор, который рисует план дома. Ты говоришь: "Здесь должна быть дверь, здесь — окно, а крыша — обязательна, иначе будет пиздец". Но ты сам кирпичи не кладешь. Ты просто говоришь, что должно быть. Вот эти твои планы — это и есть абстрактный класс, ёпта. Конкретную дверь — деревянную или железную — будут делать уже строители (то есть дочерние классы).

В Python за эту хуйню отвечает модуль abc — Abstract Base Classes. Там два главных героя:

  1. ABC — это как штамп "Я — план, а не готовый дом". От него наследуешься.
  2. @abstractmethod — это твоя грозная отметка красным маркером на плане: "ЭТОТ МЕТОД ОБЯЗАН БЫТЬ, ИНАЧЕ ВСЁ РУХНЕТ!".

Смотри, как это выглядит в деле. Делаем интерфейс для любого транспорта.

from abc import ABC, abstractmethod

# Вот наш план, наша абстрактная хрень. Наследуемся от ABC.
class Transport(ABC):

    @abstractmethod  # Вешаем декоратор и говорим: "Этот метод — святое, его надо сделать!"
    def move(self):
        """Этот метод должен быть реализован всеми подклассами."""
        pass  # Здесь пустота, потому что это только требование.

# А теперь приходят конкретные ребята и делают по плану.
class Car(Transport):
    def move(self):  # Без этого метода — никак. Обязаловка.
        print("Автомобиль едет по дороге")

class Boat(Transport):
    def move(self):  # Реализовал? Молодец. Работай.
        print("Лодка плывет по воде")

# Используем
car = Car()
boat = Boat()

car.move()  # Автомобиль едет по дороге
boat.move() # Лодка плывет по воде

# А теперь смотри, что будет, если какой-то умник попробует проигнорировать правило.
try:
    class Plane(Transport):  # Объявил класс, но метод move не сделал. Ну-ну.
        pass  # Типа, и так сойдет.
    cessna = Plane()  # Пытаемся создать самолет...
except TypeError as e:
    print(f"nОшибка: {e}")
    # И получаем по ебалу: Can't instantiate abstract class Plane with abstract method move

Вот и вся магия, блядь. Система не даст тебе создать объект, если ты не выполнил "контракт". Это как если бы ты пришел на завод собирать машину, а двигатель забыл — тебя бы просто выперли пинком под жопу, и правильно бы сделали.

Получается надёжно: ты всегда знаешь, что у любого объекта, который говорит, что он Transport, точно есть метод .move(). И не надо гадать, "а есть ли он вообще, или сейчас вылетит ошибка". Удивление — пиздец, а предсказуемость — на высоте.