Абстрактные классы в 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-канал.