@abstractmethod) и свойств (@property с @abstractmethod.getter).  Классы, наследующие от ABC, должны реализовать эти методы/свойства.Все эти механизмы позволяют проектировать более гибкие и расширяемые системы, определяя, какие атрибуты и методы должны быть реализованы, а также предоставляя более контролируемый доступ к данным внутри класса.
В Python, для поддержки интерфейсов и объединения методов и свойств, существует несколько подходов. Важно понимать, что Python не имеет строгой концепции интерфейсов, как, например, в Java или C#. Вместо этого используется концепция "утиной типизации" (duck typing), где важна не принадлежность к определенному классу, а наличие необходимых методов и свойств.
1. Абстрактные базовые классы (ABC):
Модуль abc предоставляет инструменты для создания абстрактных классов и методов. Абстрактные методы должны быть реализованы в подклассах, иначе возникнет исключение при создании экземпляра подкласса.  abc.abstractmethod используется для обозначения абстрактных методов.
from abc import ABC, abstractmethod
class MyInterface(ABC):
    @abstractmethod
    def my_method(self):
        pass
    @property
    @abstractmethod
    def my_property(self):
        pass
    @my_property.setter
    @abstractmethod
    def my_property(self, value):
        pass
class MyClass(MyInterface):
    def my_method(self):
        print("My method implementation")
    @property
    def my_property(self):
        return self._my_property
    @my_property.setter
    def my_property(self, value):
        self._my_property = value
    
    def __init__(self):
        self._my_property = 0
instance = MyClass()
instance.my_method()
instance.my_property = 10
print(instance.my_property)
2. Protocol (Начиная с Python 3.8):
Protocol - это формальный способ указания интерфейсов с использованием статической типизации (type hints). Protocol говорит, какие методы и атрибуты должны быть у класса, чтобы считаться совместимым с этим протоколом. mypy проверяет соответствие типов.
from typing import Protocol
class SupportsRead(Protocol):
    def read(self, size: int) -> str:
        ...
def process_data(reader: SupportsRead):
    data = reader.read(1024)
    # ... обработка данных ...
class MyFileReader:
    def read(self, size: int) -> str:
        # ... реальная реализация чтения из файла ...
        return "Data from file"
file_reader = MyFileReader()
process_data(file_reader) # mypy проверит, что MyFileReader имеет метод read
3. Duck typing:
Самый распространённый подход в Python.  Просто полагаемся на то, что объект имеет нужные методы и свойства.  Если объект не предоставляет необходимые методы во время выполнения, возникнет исключение AttributeError.
class Duck:
    def quack(self):
        print("Quack!")
    def fly(self):
        print("Fly!")
class Person:
    def quack(self):
        print("I'm imitating a duck!")
    def fly(self):
        print("I'm pretending to fly!")
def make_it_quack_and_fly(thing):
    thing.quack()
    thing.fly()
duck = Duck()
person = Person()
make_it_quack_and_fly(duck)  # Работает
make_it_quack_and_fly(person) # Работает, хотя Person не Duck
4. Использование Properties:
Properties позволяют получить доступ к атрибутам класса через методы, обеспечивая инкапсуляцию и контроль над доступом. Они выглядят как обычные атрибуты, но позволяют выполнять дополнительную логику при чтении, записи или удалении значения.
class Circle:
    def __init__(self, radius):
        self._radius = radius
    @property
    def radius(self):
        return self._radius
    @radius.setter
    def radius(self, value):
        if value < 0:
            raise ValueError("Radius cannot be negative")
        self._radius = value
    @property
    def area(self):
        return 3.14159 * self._radius * self._radius
circle = Circle(5)
print(circle.radius) # Получаем радиус
circle.radius = 10  # Устанавливаем радиус
print(circle.area)   # Получаем площадь
Вывод:
Выбор конкретного подхода зависит от требований проекта. Если нужна строгая проверка интерфейсов на этапе разработки, стоит использовать ABC или Protocol. Для гибкости и простоты реализации, Duck typing часто является достаточным. Properties полезны для контроля доступа к атрибутам и добавления логики.