Абстракция и Интерфейсы

Абстракция — это процесс выделения наиболее значимых характеристик объекта, игнорируя менее значимые детали. В контексте ООП абстракция позволяет сосредоточиться на том, что делает объект, а не на том, как он это делает. В Python абстракция часто реализуется с помощью абстрактных классов и методов.

Зачем нужна абстракция?

  • Упрощение разработки сложных систем.
  • Повышение уровня повторного использования кода.
  • Создание общих интерфейсов для работы с различными реализациями.

Абстрактные классы и методы в Python

Для создания абстрактных классов и методов в Python используется модуль abc (Abstract Base Classes). Абстрактные методы — это методы, которые объявлены, но не имеют реализации. Они предназначены для того, чтобы их реализовывали в дочерних классах.

from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        pass

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    def area(self):
        return self.width * self.height

rect = Rectangle(5, 10)
print(rect.area())  # 50

В этом примере класс Shape является абстрактным, поскольку содержит абстрактный метод area. Класс Rectangle наследует от Shape и реализует метод area.

Интерфейсы

Хотя в Python нет явной поддержки интерфейсов, как в некоторых других языках, вы можете имитировать их с помощью абстрактных классов. Интерфейс — это контракт, который определяет набор методов, которые должны быть реализованы в классах, использующих данный интерфейс.

from abc import ABC, abstractmethod

class Drawable(ABC):
    @abstractmethod
    def draw(self):
        pass

class Circle(Drawable):
    def __init__(self, radius):
        self.radius = radius
    
    def draw(self):
        print(f"Круг радиусом {self.radius}")

circle = Circle(5)
circle.draw()  # Круг радиусом 5

В этом примере класс Drawable играет роль интерфейса, требуя от всех своих наследников реализовать метод draw.

Источник: https://stepik.org/lesson/1584617/step/1?unit=1605974

Было ли это полезно?

0 / 0