Протокол с параметром типа в ООП в Python
Протокол описывает, какие методы должен иметь объект, без наследования от общего базового класса. Протокол тоже может быть обобщённым.
Объявим протокол Named
с параметром T и методом
get, возвращающим T:
from typing import Protocol
class Named[T](Protocol):
def get(self) -> T:
...
Любой класс с подходящим методом
get считается совместимым,
даже если он не наследует протокол:
class Employee:
def __init__(self, name):
self.name = name
def get(self):
return self.name
Напишем функцию, которая принимает
объект по протоколу Named:
def read_name(obj: Named[str]) -> str:
return obj.get()
emp = Employee('john')
print(read_name(emp)) # выведет 'john'
Employee не упоминает протокол,
но у него есть метод get
с нужной сигнатурой, поэтому объект
подходит для функции read_name.
Сделайте протокол SizedValue[T]
с методом read, возвращающим
T. Сделайте класс Product
с методом read и проверьте
передачу в функцию по протоколу.