TGViewer
Oh My Py Oh My Py @ohmypy · 2.26K subscribers
Post #163 4.28K
Через протокол

Цитата выше взята из PEP 544 (Python Enhancement Proposal, предложение о доработке), который был реализован в Python 3.8. Начиная с этой версии в питоне появились протоколы.

Протокол описывает поведение без реализации (в других языках такие штуки обычно называют интерфейсами). Вот наш Летающий Объект:

from typing import Protocol

class Flyer(Protocol):
def fly(self):
...


Мы используем протокол, чтобы указать, что объект должен обладать конкретным поведением. Наша функция умеет запускать только Летающие Объекты:

def launch(thing: Flyer):
thing.fly()


Причем самим объектам не надо знать о протоколе. Достаточно обладать нужным поведением:

class Frank:
def fly(self):
# ...

class Plane:
def fly(self):
# ...

class Superman:
def fly(self):
# ...


Протокол — это статическая утиная типизация:

— интерфейс явно описан в протоколе: летающий объект обладает методом fly();
— но реализуется он неявно, по «утиному» принципу: у Супермена есть метод fly() — значит он летающий объект.

Проверим:

$ mypy flyer.py
Success: no issues found in 1 source file


Идеально!
  • 👍 63
  • 🤔 4
More from @ohmypy
  1. Apr 4, 2023ChatGPT-бот: группы, внешние ссылки, шорткаты Сделать GPT-бота легко, а вот удобного GPT-б…
  2. Mar 11, 2023ChatGPT-бот на Python Последние месяцы поставили рекорд по количеству программ, интегриров…
  3. Aug 3, 2022JSON Lines На днях узнал про формат JSON Lines. Это такой CSV на стероидах: — каждая запис…
  4. Jul 18, 2022Попробуйте Go Чем больше я узнаю Python, тем больше мне нравится Go. Альберт Эйнштейн Нет,…
  5. Jun 1, 2022Многозначительное многоточие Не знаю, заметили вы или нет в посте о протоколах. Не самая и…
  6. May 31, 2022Через базовый класс Если расчехлить навыки программирования на джаве из 1990-х годов, полу…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →