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

您没有超载。通过对不同的对象使用相同的名称,可以将一件事隐藏在另一件事之后。尝试

sum = 42

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

在第一个例子中,定义函数并使用它,然后用另一个函数覆盖它,并使用新的函数,就像使用常规变量一样:

a = 1
print(a)
a = 2
print(a)

最新更新