Sobes.tech
Back to questions
Junior — Middle
65

В каких ситуациях предпочтительно использовать протоколы вместо абстрактных базовых классов при разработке интерфейсов в Python?

Answer from AI

sobes.tech AI

В Python протоколы (protocols) предпочтительнее использовать вместо абстрактных базовых классов (ABC) в ситуациях, когда важна гибкость и duck typing — то есть когда нужно определить интерфейс, который может реализовываться разными классами без явного наследования.

Протоколы позволяют описать набор методов и атрибутов, которые объект должен иметь, но не требуют наследования от конкретного базового класса. Это удобно, если вы хотите, чтобы разные объекты с разной иерархией могли использоваться взаимозаменяемо, если они соответствуют протоколу.

Пример ситуации:

  • Вы пишете функцию, которая работает с любым объектом, у которого есть метод read(). Вместо того, чтобы требовать наследование от абстрактного класса, вы можете определить протокол с методом read() и принимать любые объекты, соответствующие этому протоколу.

Это улучшает совместимость и уменьшает связанность кода.

Пример протокола:

from typing import Protocol

class Readable(Protocol):
    def read(self) -> str:
        ...

def process(reader: Readable):
    data = reader.read()
    print(data)

Здесь любой объект с методом read можно передать в process, даже если он не наследует Readable.