2009-04-09 5 views
58

Как это говорит:Функция перегрузки в Python: Отсутствует

http://web.archive.org/web/20090624083829/http://mail.python.org/pipermail/python-list/2003-May/206149.html

Перегрузка функций отсутствует в Python.

Насколько я чувствую, это большой недостаток, так как он также является языком OO. Первоначально я обнаружил, что трудно различать типы аргументов, но динамическая природа Python упростила (например, список, кортежи, строки очень похожи).

Однако подсчет количества переданных аргументов, а затем выполнение задания, похоже на перебор.

+3

Итак? Как вы думаете, для чего вам нужно перегружать? – kquinn

+2

Голосование, чтобы закрыть как не настоящий вопрос. Это не значит, что это не потенциально допустимый момент, но это не вопрос. –

+0

Ну, тогда используйте язык, который обеспечивает перегрузку ... –

ответ

31

Как размотать отметил, ключевые аргументы со значениями по умолчанию может пойти длинный путь.

Я также заявляю, что, на мой взгляд, это противоречит духу 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, как что иногда указывает на проблему проектирования.

+36

Тогда пример без проблем дизайна. – accuya

+1

Конечно, это немного надуманно, но это суммирует список int/str и считает, что '[a-z]/i' имеет значения 1-26: https://gist.github.com/cmattoon/abeed5fb8367b0b869cf –

6

Часто вы видите, что использование предложения использует аргументы ключевого слова с значениями по умолчанию. Посмотрите на это.

22

Вам не нужна перегрузка функции, так как у вас есть аргументы * args и ** kwargs.

Дело в том, что перегрузка функций основана на идее, что передача различных типов выполняется другим кодом. Если у вас динамически типизированный язык, такой как python, вы не должны различать по типу, но вам нужно иметь дело с интерфейсами и их соблюдением кода, который вы пишете.

Например, если у вас есть код, который может обрабатывать целое число или список целых чисел, вы можете попробовать выполнить итерацию на нем, и если вы не в состоянии, то вы предполагаете, что это целое число и идти вперед. Конечно, это может быть float, но, насколько это касается поведения, если float и int кажутся одинаковыми, тогда они могут быть взаимозаменяемы.

+6

Перегрузка не строго о типах, это также о количестве аргументов. Например, я могу захотеть, чтобы мой аксессор и мутатор (или «getter» и «setter», если вы предпочитаете), чтобы использовать одно имя метода, но они явно делают отдельные вещи в зависимости от наличия аргумента. Это не имеет никакого отношения к типу аргумента. – Nerdmaster

6

Вы можете передать изменяемый тип данных контейнера в функцию, он может содержать все, что вы хотите.

Если вам нужна другая функциональность, назовите функции по-разному или если U нужен один и тот же интерфейс, просто напишите функцию (или метод) интерфейса, которая вызывает функции соответствующим образом на основе полученных данных.

потребовалось некоторое время, чтобы мне привыкнуть к этому идет от Java, но это реально не «большой гандикап»

37

Теперь, если вы не пытаетесь писать код C++ с использованием синтаксиса Python, что бы вы нужна перегрузка?

Я думаю, что это абсолютно противоположно, перегрузка необходима только для того, чтобы сильно типизированные языки действовали скорее как Python. В Python у вас есть аргумент ключевого слова, у вас есть *args и **kwargs.

Смотрите, например: What is a clean, pythonic way to have multiple constructors in Python?

+54

Ваша оценка того, что перегрузка - «взлом - работа для языков с ограниченными физическими возможностями» - кажется слишком поляризованной и не учитывает преимущества статической типизации и ее пригодности для другого типа развертывания. [Ответ Стефано Борини] (http://stackoverflow.com/a/733385/322333), что перегрузка функции .. .. основана на идее, что передача разных типов выполняется другим кодом. Если у вас есть динамически типизированный язык, например python, вы не должны различать по типу «_ более информативным и полезным, я думаю. – boycy

+8

Конечно, вы можете использовать переменные аргументы в C++, но перегрузка используется для сохранения кода * clean *. Как и в случае, одна функция делает одну вещь, а не одну функцию, замусоренную операторами if, пытающимися выяснить, что делать на основе того, что было передано. – Nerdmaster