如果Python不支持方法重载(除了* args和** kwargs或PEP 3124),那么为什么这个重载会起作用?
if ($e instanceof \Illuminate\Auth\Access\UnauthorizedException) {
return response()->view('errors.403');
}
......虽然更令人费解,但这个并不是:
# 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))
答案 0 :(得分:3)
你不会超载。您通过对不同对象使用相同的名称来隐藏另一个东西。尝试
sum = 42
并了解print(sum(3, 5))
如何停止工作。
答案 1 :(得分:1)
在你的第一个例子中,你定义了函数并使用它,然后用另一个覆盖它,并使用新函数,就像使用常规变量一样:
a = 1
print(a)
a = 2
print(a)
答案 2 :(得分:1)
函数定义是变量赋值。它们创建一个函数并将其分配给与您使用的名称匹配的变量。您正在看到重新分配变量的普通效果。
def sum(n):
...
这为变量sum
指定了1个参数的函数。
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
分配不同的函数,然后尝试使用第一个赋值中的值。它找到第二个函数,但失败了。