abc
(Abstract Base Classes) и декоратор @abstractmethod
. Подклассы должны переопределить все абстрактные методы родительского класса, иначе они также будут считаться абстрактными и не смогут быть инстанцированы.
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area(self):
pass
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14 * self.radius * self.radius
# shape = Shape() # Ошибка: нельзя создать экземпляр абстрактного класса
circle = Circle(5)
print(circle.area())
Абстрактный класс - это класс, который не может быть инстанцирован (то есть, нельзя создать его экземпляр напрямую). Он служит как чертёж или шаблон для других классов, которые наследуются от него.
Основная цель абстрактного класса - определить интерфейс (набор методов), который должен быть реализован в его подклассах. Некоторые методы в абстрактном классе могут быть абстрактными (не иметь реализации), другие - конкретными (иметь реализацию).
Как использовать абстрактные классы в наследовании:
Пример:
import abc
class Shape(abc.ABC):
@abc.abstractmethod
def area(self):
pass
@abc.abstractmethod
def perimeter(self):
pass
def describe(self):
return "This is a shape."
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14 * self.radius * self.radius
def perimeter(self):
return 2 * 3.14 * self.radius
class Square(Shape):
def __init__(self, side):
self.side = side
def area(self):
return self.side * self.side
def perimeter(self):
return 4 * self.side
# Нельзя создать экземпляр Shape напрямую
# shape = Shape() # TypeError: Can't instantiate abstract class Shape with abstract methods area, perimeter
circle = Circle(5)
print(f"Circle area: {circle.area()}")
print(f"Circle perimeter: {circle.perimeter()}")
print(circle.describe())
square = Square(4)
print(f"Square area: {square.area()}")
print(f"Square perimeter: {square.perimeter()}")
print(square.describe())
Преимущества использования абстрактных классов: