Ответ
Интерфейс в ООП — это контракт, который определяет набор методов, которые должен реализовать класс, не указывая, как именно он их реализует. Это позволяет обеспечить полиморфизм и слабую связность компонентов системы.
В Python интерфейсы не являются встроенной конструкцией языка, но их принято реализовывать с помощью абстрактных базовых классов (Abstract Base Classes) из модуля abc.
Ключевые цели:
- Определение контракта: Гарантирует, что все классы-наследники будут иметь одинаковый набор методов.
- Полиморфизм: Позволяет работать с разными объектами через единый интерфейс.
- Проверка типов: Можно использовать
isinstance()для проверки, реализует ли класс определённый интерфейс.
Пример:
from abc import ABC, abstractmethod
# 1. Определяем интерфейс (абстрактный класс)
class Serializable(ABC):
@abstractmethod
def to_json(self):
"""Возвращает JSON-представление объекта."""
pass
# 2. Реализуем интерфейс в конкретных классах
class User(Serializable):
def __init__(self, name, email):
self.name = name
self.email = email
def to_json(self):
return f'{{"name": "{self.name}", "email": "{self.email}"}}'
class Product(Serializable):
def __init__(self, title, price):
self.title = title
self.price = price
def to_json(self):
return f'{{"title": "{self.title}", "price": {self.price}}}'
# Попытка создать экземпляр класса, не реализовавшего метод, вызовет TypeError
# class Broken(Serializable):
# pass
# b = Broken() # -> TypeError: Can't instantiate abstract class Broken with abstract method to_json
Таким образом, abc позволяет создавать строгие контракты, которым должны следовать дочерние классы.