Эта функция перегружена или что-то? - PullRequest
1 голос
/ 15 марта 2012
def func(a, b, c='four'):
    print 'a is %s, b is %s, c is %s' %(a, b ,c)

func('one','two','three')
func('one', 'two')

Этот код работает без проблем. Но как это называется? 'Перегрузка'?

Кстати, этот стиль доступен только в Python? Спасибо!

Ответы [ 4 ]

5 голосов
/ 15 марта 2012

Python вызывает эти ' значения аргументов по умолчанию '.Это очень простая форма перегрузки функции (перегрузка на ' arity ' (т.е. сколько аргументов имеет функция)).Это так же сложно, как вы можете сделать с перегрузкой функций в Python.

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

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

Одна вещь, которая отличается от аргументов Python по умолчанию и отличается от C ++, состоит в том, что Python имеет именованные аргументы, что означаетявное переопределение определенного значения по умолчанию без переопределения других.

Например:

def foo(bar, baz="A baz", qux=0):
    return "(%r, %r, %r)" % (bar, baz, qux)

foo(5)
(5, 'A baz', 0)
foo(5, qux=2)
(5, 'A baz', 2)

Существуют и другие языки, которые допускают это.Я полагаю, например, что это то, что Ruby допускает, хотя я не уверен, что такое синтаксис.

Наконец, Python, как ни странно, имеет перегрузку операторов.Это осуществляется с помощью функций со специальными зарезервированными именами , которые являются частью класса.Такие функции всегда имеют вид __name__.Правила того, как именно перегрузка операторов работает в случае любого отдельного оператора, могут быть немного странными, и я бы вообще рекомендовал не использовать эту функцию в большинстве случаев, особенно для перегрузки числовых или реляционных операторов.

2 голосов
/ 15 марта 2012

Нет, это пример значений аргументов по умолчанию .

Значения аргумента по умолчанию доступны на многих языках .

1 голос
/ 15 марта 2012

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

Способ, которым Python выполняет фактическую перегрузку операторов, состоит в том, чтобы иметь специальные функции методов, которые вы можете опционально определять в классе. Поскольку Python делает это таким образом, невозможно перегрузить операции только для встроенных типов; Вы не можете перегрузить оператор + в выражении 1 + 1. Тем не менее, вы можете сделать подкласс int и перегружать этот подкласс, чтобы делать все, что вы хотите. MyClass(1) + 1 может иметь перегруженный оператор +.

Для получения дополнительной информации о перегрузке операторов в Python:

перегрузка оператора в python

0 голосов
/ 15 марта 2012

Это называется значения аргумента по умолчанию .

Это не только функция Python, один пример - C ++, а есть и другие.

Python не поддерживает перегрузку функций (в отличие от C ++).Перегрузка функций - это когда у вас несколько функций с одинаковым именем, и компилятор выясняет, какую функцию вы вызываете, основываясь на количестве переданных аргументов и их типах.

...