Если 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)