Если расчехлить навыки программирования на джаве из 1990-х годов, получится небольшая иерархия:
class Flyer:
def fly():
...
class Frank(Flyer):
# ...
class Plane(Flyer):
# ...
class Superman(Flyer):
# ...
def launch(flyer: Flyer):
flyer.fly()
Подход рабочий:
$ mypy flyer.py
Success: no issues found in 1 source file
Но, как говорят авторы Python, ужасно «непитоничный»:
The problem is that a class has to be explicitly marked, which is unpythonic and unlike what one would normally do in idiomatic dynamically typed Python code.
Действительно. Мало того, что нам пришлось модифицировать три класса вместо одной функции. Мало того, что у нас в коде завелась иерархия наследования.
Так еще и Френк, самолет и Супермен теперь объединены общим знанием о том, что они Летающие Объекты. Им прекрасно жилось и без этого, знаете ли.