В языке С++ существует понятие
Перегрузка функций (или Перегруженные функции)
Перегруженная функция это такая функция, которая определена несколько раз с одинаковым именем, но разным возвращаемым типом данных и разным набором параметров.
int c; float d; void setup() { float af = 5.5; float bf = 0.25; Serial.begin(9600); c = sumFunction(10, 20); // результат 30 c = sumFunction(10, 20, 30); // результат 60 d = sumFunction(af, bf); // результат 5.75 Serial.println(c); Serial.println(d); } void loop() { } int sumFunction(int paramA, int paramB) { return (paramA + paramB); } int sumFunction(int paramA, int paramB, int paramC) { return (paramA + paramB + paramC); } float sumFunction(float paramA, float paramB) { return (paramA + paramB); }
Итак, у нас теперь целых три функции с одинаковым именем, но разными наборами параметров и типов возвращаемого значения. Программа сама разберётся, какую из функций использовать, на основе передаваемых параметров. Передали два float – работает третья функция, вернёт float. Передали три int – получили их сумму при помощи второй по счёту функции. Передали два int – получили их сумму при помощи первой функции. Вот такая удобная штука! Ещё одним вариантом перегруженной функции является шаблонная функция, она позволяет работать с данными любого типа, будучи объявлена один раз. Читайте ниже.
Нужно понять концепцию перегрузки и почему она неприменима к Python.
При работе с языками, которые могут различать типы данных во время компиляции, выбор между альтернативами может происходить во время компиляции. Акт создания таких альтернативных функций для выбора во время компиляции обычно называется перегрузкой функции. ( Википедия )
Python-это динамически типизированный язык, поэтому понятие перегрузки к нему просто неприменимо. Однако еще не все потеряно, так как мы можем создавать такие альтернативные функции во время выполнения:
В языках программирования, которые откладывают идентификацию типа данных до момента выполнения выбора среди альтернативных функции должны выполняться во время выполнения на основе динамически определяемых типов аргументов функций. Функции, альтернативные реализации которых выбраны таким образом , чаще всего называются мультиметодами . ( Википедия )
Таким образом, мы должны быть в состоянии выполнять мультиметоды в Python—или, как это альтернативно называется: множественная отправка .
Многократная отправка
Мультиметоды также называются множественной отправкой :
Множественная отправка или мультиметоды-это особенность некоторых объектно-ориентированные языки программирования, в которых функция или метод могут быть динамически отправлены на основе типа времени выполнения (динамического) нескольких его аргументов. ( Википедия )
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