Ответ
Абстрактный класс (Abstract Base Class, ABC) в Python — это класс, который не может иметь экземпляров и предназначен для использования в качестве базового класса для других классов.
Основная цель — определить общий интерфейс (контракт), который обязаны реализовать все его дочерние классы. Это обеспечивает полиморфизм и делает архитектуру приложения более предсказуемой и надежной.
Для создания используется модуль abc.
Ключевые элементы:
ABC: Метакласс, который делает класс абстрактным.@abstractmethod: Декоратор, помечающий метод как абстрактный. Дочерний класс обязан переопределить этот метод.
Пример
from abc import ABC, abstractmethod
# Абстрактный класс, определяющий интерфейс для всех "транспортных средств"
class Vehicle(ABC):
@abstractmethod
def move(self):
"""Этот метод должен быть реализован в каждом подклассе."""
pass
# Конкретная реализация
class Car(Vehicle):
def move(self):
return "Car is driving on the road."
class Boat(Vehicle):
def move(self):
return "Boat is sailing on the water."
# Попытка создать экземпляр абстрактного класса вызовет ошибку
# vehicle = Vehicle() # TypeError: Can't instantiate abstract class Vehicle with abstract method move
# Экземпляры дочерних классов создаются без проблем
car = Car()
print(car.move()) # -> "Car is driving on the road."
Абстрактные классы особенно полезны при создании фреймворков, плагинов или сложных систем, где необходимо гарантировать, что различные компоненты будут следовать единому стандарту.
Ответ 18+ 🔞
Слушай, а вот есть в Питоне такая штука, как абстрактный класс, или, по-умному, Abstract Base Class (ABC). Представь себе, это такой начальник-идеалист, который сам нихуя не делает, но всем своим подчиненным раздает четкие указания: "Вот это и вот это вы обязаны делать, а как именно — ваше дело, но чтоб было!".
Если попробовать создать экземпляр этого начальника-класса, Питон тебе такую ошибку влепит, что мало не покажется. Он тебе скажет: "Ты че, ебушки-воробушки, это же абстракт! Иди конкретики наберись!".
Вот смотри, как это выглядит в коде. Тут всё строго, без дураков:
from abc import ABC, abstractmethod
# Вот наш главный по тарелкам — абстрактный класс Vehicle.
# Он говорит: "Все, кто от меня произойдет, ДОЛЖНЫ уметь двигаться!"
class Vehicle(ABC):
@abstractmethod
def move(self):
"""Этот метод должен быть реализован в каждом подклассе."""
pass
# А вот его дети. Один — конкретный мужик на колесах.
class Car(Vehicle):
def move(self):
return "Car is driving on the road."
# Другой — чувак, который плавает.
class Boat(Vehicle):
def move(self):
return "Boat is sailing on the water."
# Попробуй создать самого начальника — получишь пиздюлину от интерпретатора.
# vehicle = Vehicle() # TypeError: Can't instantiate abstract class Vehicle with abstract method move
# А вот его дети — молодцы, работают.
car = Car()
print(car.move()) # -> "Car is driving on the road."
Суть в чем? Ты создаешь каркас, общий контракт. Все, кто наследуется от Vehicle, ОБЯЗАНЫ иметь метод move(). Иначе — нихуя не получится, класс тоже будет считаться абстрактным, и экземпляр не создашь.
Это овердохуища полезно, когда пишешь какую-нибудь систему плагинов или фреймворк. Ты говоришь всем разработчикам: "Ребята, хотите со мной работать — вот вам список обязательных пунктов. Реализуйте их как хотите, хоть на ушах стойте, но чтоб методы эти были!". И все довольны: система предсказуемая, а полиморфизм, этот хитрожопый зверь, работает как часы. Красота, блядь!