Что такое абстрактные классы

Абстрактный класс - это класс, который является классом-шаблоном для других классов. Он содержит один или несколько абстрактных методов. Он не предназначен для создания объектов напрямую.

Абстрактный метод - это метод, который объявлен в абстрактном классе, но не имеет реализации. Он служит как бы шаблоном для метода, который должен быть реализован в подклассах.

from abc import ABC, abstractmethod

class Animal(ABC):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    @abstractmethod
    def make_sound(self):
        pass

class Dog(Animal):
    def make_sound(self):
        return "Woof!"

class Cat(Animal):
    def make_sound(self):
        return "Meow!"

Зачем они нужны?

  • Чтобы создать общий интерфейс
    • Классы будут иметь общие методы и свойства, но могут реализовывать их по-разному.
    • Все дочерние классы должны будут обязательно иметь реализацию каждого абстрактного метода, поэтому мы точно будем уверены, что во всех классах, созданных на основе абстрактного класса, будет иметься реализация абстрактных методов
  • Устранение дублирования кода
    • Например вынести метод init в абстрактный класс

Oct. 9, 2023, Источник

Абстрактные классы - это классы содержащие один или несколько абстрактных методов. Абстрактный метод - это метод, который определен в абстрактном классе, но не имеет реализации в самом классе. Вместо этого они должны быть реализованы в подклассах, наследующих абстрактный класс.

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

Абстрактные классы можно создать с помощью модуля `abc` (Abstract Base Classes). Вот пример:

from abc import ABC, abstractmethod

class Animal(ABC):  # Наследование от ABC позволяет создать абстрактный класс
    @abstractmethod
    def make_sound(self):
        pass

class Dog(Animal):  # Класс Dog наследует абстрактный класс Animal
    def make_sound(self):
        return "Woof!"

class Cat(Animal):  # Класс Cat также наследует абстрактный класс Animal
    def make_sound(self):
        return "Meow!"

# Создаем экземпляры подклассов и вызываем методы
dog = Dog()
print(dog.make_sound())  # Выведет: Woof!

cat = Cat()
print(cat.make_sound())  # Выведет: Meow!

В приведенном выше примере класс `Animal` является абстрактным, потому что он содержит абстрактный метод `make_sound()`. Этот метод должен быть реализован в каждом конкретном подклассе `Dog` и `Cat`. Если попытаться создать экземпляр `Animal`, Python выдаст ошибку, потому что эти классы не могут быть инстанциированы напрямую.

Feb. 17, 2024, easyoffer