Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗pyOpPtMt 139 of 174 menu
◀ ▶

Соответствие протоколу без наследования в 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 и передайте в нее оба класса.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить