如果Python不支持方法重载,那么为什么这个方法超载工作而另一个不工作?

时间:2015-12-13 21:33:40

标签: python overloading

如果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))

3 个答案:

答案 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分配不同的函数,然后尝试使用第一个赋值中的值。它找到第二个函数,但失败了。