Соответствие протоколу без наследования в Python
Главное отличие протокола от абстрактного родителя: класс не обязан наследовать протокол. Python смотрит на набор методов объекта. Если методы совпали - тип подходит.
Давайте объявим протокол HasName:
from typing import Protocol
class HasName(Protocol):
def name(self) -> str:
...
Сделаем два разных класса с методом
name. Ни один не наследует
HasName:
class User:
def __init__(self, name):
self.__name = name
def name(self):
return self.__name
class Employee:
def __init__(self, name, salary):
self.__name = name
self.__salary = salary
def name(self):
return self.__name
Одна функция может принимать оба типа:
def greet(obj: HasName):
print('hello, ' + obj.name())
user = User('john')
emp = Employee('smit', 1000)
greet(user)
greet(emp)
Классы устроены по-разному: у Employee
есть зарплата, у User - нет. Для
HasName важен только метод name.
Так работает структурная типизация: важен контракт методов, а не родословная класса.
Объявите протокол HasSalary
с методом salary.
Сделайте классы Employee и
Manager с методом salary
без наследования протокола.
Напишите функцию с параметром типа
HasSalary и передайте в нее
оба класса.