То, что вы просите, называется многократная отправка .См. Julia языковые примеры, демонстрирующие различные типы отправок.
Однако, прежде чем посмотреть на это, мы сначала разберемся, почему перегрузка 1008 * не совсем то, что вы хотите вpython.
Почему бы не перегрузить?
Сначала нужно понять концепцию перегрузки и почему она не применима к python.
При работе с языками, которые могутразличать типы данных во время компиляции, выбор между альтернативами может происходить во время компиляции.Создание таких альтернативных функций для выбора во время компиляции обычно называется перегрузкой функции.( Wikipedia )
Python - это динамически типизированный язык, поэтому концепция перегрузки просто к нему не относится.Тем не менее, еще не все потеряно, поскольку мы можем создавать такие альтернативные функции во время выполнения:
В языках программирования, которые откладывают идентификацию типа данных до времени выполнения выбора среди альтернативфункции должны появляться во время выполнения, основываясь на динамически определенных типах аргументов функции.Функции, альтернативные реализации которых выбраны таким образом, чаще всего называются мультиметодами .( Википедия )
Таким образом, мы должны быть в состоянии сделать мультиметоды в python или, как его еще называют, многократная отправка .
Многократная отправка
Мультиметоды также называются многократная отправка :
Многократная отправка или мультиметоды - это особенность некоторых объектно-ориентированныхязыки программирования, в которых функция или метод могут быть динамически отправлены на основе типа времени выполнения (динамического) нескольких аргументов.( Wikipedia )
Python не поддерживает это из коробки 1 .Но, как оказалось, есть отличный пакет python под названием multipledispatch , который делает именно это.
Решение
Вот как мы можем использовать multipledispatch 2 для реализации ваших методов:
>>> from multipledispatch import dispatch
>>> from collections import namedtuple
>>> from types import * # we can test for lambda type, e.g.:
>>> type(lambda a: 1) == LambdaType
True
>>> Sprite = namedtuple('Sprite', ['name'])
>>> Point = namedtuple('Point', ['x', 'y'])
>>> Curve = namedtuple('Curve', ['x', 'y', 'z'])
>>> Vector = namedtuple('Vector', ['x','y','z'])
>>> @dispatch(Sprite, Point, Vector, int)
... def add_bullet(sprite, start, direction, speed):
... print("Called Version 1")
...
>>> @dispatch(Sprite, Point, Point, int, float)
... def add_bullet(sprite, start, headto, speed, acceleration):
... print("Called version 2")
...
>>> @dispatch(Sprite, LambdaType)
... def add_bullet(sprite, script):
... print("Called version 3")
...
>>> @dispatch(Sprite, Curve, int)
... def add_bullet(sprite, curve, speed):
... print("Called version 4")
...
>>> sprite = Sprite('Turtle')
>>> start = Point(1,2)
>>> direction = Vector(1,1,1)
>>> speed = 100 #km/h
>>> acceleration = 5.0 #m/s
>>> script = lambda sprite: sprite.x * 2
>>> curve = Curve(3, 1, 4)
>>> headto = Point(100, 100) # somewhere far away
>>> add_bullet(sprite, start, direction, speed)
Called Version 1
>>> add_bullet(sprite, start, headto, speed, acceleration)
Called version 2
>>> add_bullet(sprite, script)
Called version 3
>>> add_bullet(sprite, curve, speed)
Called version 4
1. Python 3 в настоящее время поддерживает однократную отправку
2. Будьте осторожны, чтобы не использовать multipledispatch в многопоточной среде, или выполучит странное поведение.