外观
Python 中的函数重载
Function Overloading in Python

函数重载(function overloading)对于多态(polymorphism)至关重要,在其中,我们可以拥有多个满足如下条件的函数:
- 名字相同,并且
- 参数的个数(或类型)不同。
然而,Python 并没有为函数重载提供原生支持。换句话说,如果我们定义了两个(或更多)同名但参数不同的函数,Python 只会考虑与该函数名对应的最新定义。这一点如下图所示。

如上所示,add() 的最新定义有三个参数。这就是为什么传入两个参数会报错。这限制了我们用 Python 编写良好的多态代码。当然,也有办法避免这个错误,如下图所示:

另外,如果同一个参数可以接受多种数据类型,我们可以通过 isinstance() 配合 if 语句来编写(某种程度上)多态的代码。

但这并不像在 C++ 中那样,可以通过为不同数据类型定义多个函数来得优雅,不是吗?

C++ 会根据参数的数据类型自动调用正确的方法。在为我的某个项目研究这一点时,我发现了一种相当好用的、能在 Python 中启用函数重载的方法:来自 Multidispatch 库的 @dispatch 装饰器,它让我们能够在 Python 中用上标准且优雅的函数重载,演示如下:

如上所示,我们有多个同名但参数不同的函数。@dispatch 装饰器让我们能够根据函数调用时传入的参数,调用与之对应的正确函数。关于 @dispatch 装饰器的另一个很酷之处在于:当函数调用与任何函数定义都不匹配时,它会抛出错误:

这让我们能够发现那些常常会被忽略的错误。在一个简单的实验中,我确实注意到运行时间略有增加。但增加的幅度大约在纳秒级别,完全可以忽略不计。