Перегрузка функций в Python: отсутствует
Как это говорит:
Перегрузка функций в Python отсутствует.
Насколько я чувствую, это большой недостаток, так как это также язык OO. Первоначально я обнаружил, что невозможно различить типы аргументов было сложно, но динамическая природа Python сделала это простым (например, список, кортежи, строки очень похожи).
Однако подсчет количества переданных аргументов, а затем выполнение работы - все равно что перебор.
5 ответов
Как было отмечено, аргументы ключевых слов со значениями по умолчанию могут иметь большое значение.
Я также утверждаю, что, по моему мнению, это противоречит духу Python - беспокоиться о том, какие типы передаются в методы. В Python, я думаю, более приемлемо использовать утиную типизацию - спрашивать, что может сделать объект, а не то, чем он является.
Таким образом, если ваш метод может принять строку или кортеж, вы можете сделать что-то вроде этого:
def print_names(names):
"""Takes a space-delimited string or an iterable"""
try:
for name in names.split(): # string case
print name
except AttributeError:
for name in names:
print name
Тогда вы можете сделать одно из следующих:
print_names("Ryan Billy")
print_names(("Ryan", "Billy"))
Хотя такой API иногда указывает на проблему с дизайном.
Теперь, если вы не пытаетесь писать код на C++ с использованием синтаксиса Python, для чего вам нужна перегрузка?
Я думаю, что с точностью до наоборот, перегрузка необходима только для того, чтобы заставить строго типизированные языки вести себя как Python. В Python у вас есть ключевое слово аргумент, у вас есть *args
а также **kwargs
,
Смотрите, например: Что такое чистый, питонский способ иметь несколько конструкторов в Python?
Вам не нужна перегрузка функций, так как у вас есть аргументы *args и **kwargs.
Дело в том, что перегрузка функций основана на идее, что при передаче разных типов вы будете выполнять другой код. Если у вас есть динамически типизированный язык, такой как python, вы не должны различать по типу, но вы должны иметь дело с интерфейсами и их соответствием написанному вами коду.
Например, если у вас есть код, который может обрабатывать либо целое число, либо список целых чисел, вы можете попробовать выполнить итерацию по нему, а если вы не можете, то вы предполагаете, что это целое число, и идете вперед. Конечно, это может быть float, но что касается поведения, если float и int кажутся одинаковыми, то их можно поменять местами.
Вы можете передать изменяемый тип данных контейнера в функцию, которая может содержать все, что вы хотите.
Если вам нужна другая функциональность, назовите функции по-разному или если U нужен один и тот же интерфейс, просто напишите интерфейсную функцию (или метод), которая вызывает функции соответствующим образом на основе полученных данных.
Мне потребовалось некоторое время, чтобы приспособиться к этому пришествию с Java, но это действительно не "большой гандикап"
Часто вы видите предложение использовать аргументы ключевого слова вместо значений по умолчанию. Посмотри на это.