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
Circle должен реализовать метод area, иначе будет ошибка.
Абстрактные классы в Python (используются через модуль abc
) позволяют определить общую структуру (интерфейс) для группы классов, не реализуя всю логику внутри абстрактного класса. Они служат шаблонами, которые предписывают подклассам реализовать определенные методы. Вот как их можно использовать для создания общей структуры и расширения объектов:
Импортируем модуль abc
и используем ABCMeta
в качестве метакласса и декоратор @abstractmethod
для указания абстрактных методов. Абстрактные методы не имеют реализации в абстрактном классе и должны быть реализованы в его подклассах.
import abc
class AbstractShape(abc.ABC):
@abc.abstractmethod
def area(self):
pass
@abc.abstractmethod
def perimeter(self):
pass
def describe(self):
return "Это абстрактная фигура."
Классы, наследующие от абстрактного класса, должны реализовать все абстрактные методы. Если хотя бы один абстрактный метод не реализован, при попытке создать экземпляр подкласса будет вызвано исключение TypeError
.
class Circle(AbstractShape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14159 * self.radius * self.radius
def perimeter(self):
return 2 * 3.14159 * self.radius
def describe(self):
return f"Это круг с радиусом {self.radius}."
class Square(AbstractShape):
def __init__(self, side):
self.side = side
def area(self):
return self.side * self.side
def perimeter(self):
return 4 * self.side
def describe(self):
return f"Это квадрат со стороной {self.side}."
# Пример использования:
circle = Circle(5)
square = Square(4)
print(circle.area()) # Вывод: 78.53975
print(square.perimeter()) # Вывод: 16
print(circle.describe()) # Вывод: Это круг с радиусом 5.
print(square.describe()) # Вывод: Это квадрат со стороной 4.
В примере выше, AbstractShape
определяет общую структуру для всех фигур. Классы Circle
и Square
наследуются от него и реализуют абстрактные методы area
и perimeter
, определяя специфическую логику для каждой фигуры. Метод describe
предоставляется как реализация по умолчанию, но может быть переопределен в подклассах. Это позволяет создать расширяемую и хорошо структурированную иерархию классов.