Skip to content

Python 中的函数重载

Function Overloading in Python

ds p520 1

函数重载(function overloading)对于多态(polymorphism)至关重要,在其中,我们可以拥有多个满足如下条件的函数:

  • 名字相同,并且
  • 参数的个数(或类型)不同。

然而,Python 并没有为函数重载提供原生支持。换句话说,如果我们定义了两个(或更多)同名但参数不同的函数,Python 只会考虑与该函数名对应的最新定义。这一点如下图所示。

ds p520 2

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

ds p521 1

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

ds p521 2

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

ds p522 1

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

ds p522 2

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

ds p523 1

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

本站内容仅供学习交流,版权归原作者所有。