Если Python не поддерживает перегрузку метода, то почему перегрузка этого метода работает, а другая - нет?

Если Python не поддерживает перегрузку методов (кроме *args и **kwargs или PEP 3124), то почему эта перегрузка работает?

# the sum from 1 to n
def sum(n):
    if n > 0:
        return n + sum(n - 1)
    else:
        return 0

print(sum(3))

# the sum from n to m, inclusive
def sum(n, m):
    if n <= m:
        return n + sum(n + 1, m)
    else:
        return 0

print(sum(3,5))

... в то время как больше сбивает с толку, этот не делает:

# the sum of elements in an array
def sumArray(A):
    return sumArray(A, len(A)-1)

# a helper for the above
def sumArray(A, i):
    if i < 0:
        return 0
    else:
        return A[i] + sumArray(A, i-1)

print(sumArray([1,2,3]))

3 ответа

Решение

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

def sum(n):
    ...

Это назначает функцию 1 аргумента переменной sum,

print(sum(3))

При этом используется функция, назначенная этой переменной.

def sum(n, m):
    ...

Это назначает новую функцию переменной sum, заменяя первую функцию.

print(sum(3,5))

Это использует новую функцию. Если бы вы попытались использовать старую функцию, вы бы ее не нашли.


# the sum of elements in an array
def sumArray(A):
    return sumArray(A, len(A)-1)

# a helper for the above
def sumArray(A, i):
    if i < 0:
        return 0
    else:
        return A[i] + sumArray(A, i-1)

print(sumArray([1,2,3]))

Это назначает функцию sumArrayзатем назначает другую функцию sumArray, затем пытается использовать значение из первого присваивания. Он находит вторую функцию и не работает.

Вы не перегружены. Вы прячете одну вещь за другой, используя одно и то же имя для разных объектов. Пытаться

sum = 42

и посмотри как print(sum(3, 5)) перестает работать.

В первом примере вы определяете функцию и используете ее, затем перезаписываете ее другой и используете новую, как с обычными переменными:

a = 1
print(a)

a = 2
print(a)
Другие вопросы по тегам