Абстрактные классы в Python

Абстрактные классы в Python

Эта статья объясняет, что такое абстрактные классы в Python.

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

YouTube Video

Абстрактные классы в Python

Модуль abc в Python (Abstract Base Classes - Абстрактные базовые классы) является частью стандартной библиотеки и используется для определения абстрактных классов, предоставляя шаблон для методов, которые должен реализовать класс. Использование этого модуля увеличивает гибкость и надежность в проектировании классов.

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

Абстрактные классы используются для определения общего интерфейса для конкретных (инстанцируемых) классов. Абстрактные классы не могут быть инстанцированы; их конкретная реализация должна быть предоставлена в производных (под)классах.

Модуль abc позволяет определять абстрактные методы или свойства и требовать их реализации в наследуемых классах. Если хотя бы один абстрактный метод не реализован, то класс не может быть инстанцирован.

Как использовать модуль abc

Чтобы создать абстрактный класс с использованием модуля abc, наследуйтесь от класса ABC и определяйте абстрактные методы с помощью декоратора @abstractmethod.

 1from abc import ABC, abstractmethod
 2
 3# Definition of the abstract base class
 4class Animal(ABC):
 5
 6    @abstractmethod
 7    def sound(self):
 8        pass
 9
10# Concrete implementation in the subclass
11class Dog(Animal):
12    def sound(self):
13        return "Woof!"
14
15class Cat(Animal):
16    def sound(self):
17        return "Meow!"

Здесь класс Animal определен как абстрактный и включает абстрактный метод под названием sound. Этот метод должен быть конкретно реализован в подклассах. Dog и Cat наследуются от Animal и реализуют метод sound.

Создание объектов абстрактных классов

Абстрактные классы не могут быть инстанцированы напрямую. Например, попытка инстанцировать класс Animal сама по себе приведет к ошибке.

1animal = Animal()  # TypeError: Can't instantiate abstract class Animal with abstract methods sound
  • При попытке инстанцировать абстрактный класс Python обнаруживает нереализованные абстрактные методы и вызывает TypeError. Если все необходимые абстрактные методы реализованы в подклассе, инстанцирование становится возможным.

Множественные абстрактные методы

Класс также может иметь несколько абстрактных методов. Если все абстрактные методы не реализованы в подклассе, класс остается абстрактным.

 1from abc import ABC, abstractmethod
 2
 3class Vehicle(ABC):
 4
 5    @abstractmethod
 6    def start_engine(self):
 7        pass
 8
 9    @abstractmethod
10    def stop_engine(self):
11        pass
12
13class Car(Vehicle):
14    def start_engine(self):
15        return "Car engine started"
16
17    def stop_engine(self):
18        return "Car engine stopped"

В этом примере класс Vehicle имеет два абстрактных метода, и класс Car может быть создан только после реализации обоих методов.

Определение абстрактных свойств

Модуль abc поддерживает не только абстрактные методы, но и абстрактные свойства. Это позволяет обеспечивать реализацию свойств в производных классах.

 1from abc import ABC, abstractmethod
 2
 3class Shape(ABC):
 4
 5    @property
 6    @abstractmethod
 7    def area(self):
 8        pass
 9
10class Circle(Shape):
11    def __init__(self, radius):
12        self.radius = radius
13
14    @property
15    def area(self):
16        return 3.14159 * (self.radius ** 2)
  • В этом примере класс Shape имеет абстрактное свойство area, а подкласс Circle реализует это свойство. Таким образом, использование абстрактных классов для реализации свойств помогает поддерживать согласованность кода.

Использование isinstance() и issubclass()

Используя абстрактные классы, вы можете подтвердить отношения наследования классов через isinstance() или issubclass(), что повышает безопасность и гибкость кода.

 1from abc import ABC, abstractmethod
 2
 3# Definition of the abstract base class
 4class Animal(ABC):
 5
 6    @abstractmethod
 7    def sound(self):
 8        pass
 9
10# Concrete implementation in the subclass
11class Dog(Animal):
12    def sound(self):
13        return "Woof!"
14
15class Cat(Animal):
16    def sound(self):
17        return "Meow!"
18
19class Vehicle(ABC):
20
21    @abstractmethod
22    def start_engine(self):
23        pass
24
25    @abstractmethod
26    def stop_engine(self):
27        pass
28
29class Car(Vehicle):
30    def start_engine(self):
31        return "Car engine started"
32
33    def stop_engine(self):
34        return "Car engine stopped"
35
36print("Dog() is an Animal? -> ", isinstance(Dog(), Animal))   # True
37print("Dog is subclass of Animal? -> ", issubclass(Dog, Animal))  # True
38print("Cat() is a Vehicle? -> ", isinstance(Cat(), Vehicle))  # False

isinstance() используется для проверки, является ли объект экземпляром указанного класса, а issubclass() — для проверки, является ли класс подклассом указанного класса.

Резюме

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

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

Вы можете следовать этой статье, используя Visual Studio Code на нашем YouTube-канале. Пожалуйста, также посмотрите наш YouTube-канал.

YouTube Video