Python - 方法重载



方法重载是面向对象编程的一个特性,其中一个类可以有多个同名但参数不同的方法。要重载方法,我们必须更改参数的数量或参数的类型,或两者兼而有之。

Python 中的方法重载

与 Java、C++ 和 C# 等其他编程语言不同,Python 默认不支持方法重载功能。但是,有一些替代方法可以实现它。

示例

如果您多次定义一个方法,如下面的代码所示,则最后一个定义将覆盖之前的定义。因此,这种在 Python 中实现方法重载的方式会产生错误。

class example:
   def add(self, a, b):
      x = a+b
      return x
   def add(self, a, b, c):
      x = a+b+c
      return x

obj = example()

print (obj.add(10,20,30))
print (obj.add(10,20))

第一次使用三个参数调用 add() 方法是成功的。但是,调用类中定义的只有两个参数的 add() 方法失败了。

60
Traceback (most recent call last):
 File "C:\Users\user\example.py", line 12, in <module>
  print (obj.add(10,20))
         ^^^^^^^^^^^^^^
TypeError: example.add() missing 1 required positional argument: 'c'

输出告诉您,Python 只考虑 add() 方法的最新定义,丢弃了之前的定义。

为了模拟方法重载,我们可以使用一种变通方法,为方法参数定义默认值为 None,以便它可以用于一个、两个或三个参数。

示例

下面的示例演示了如何在 Python 中实现方法重载:

class example:
   def add(self, a = None, b = None, c = None):
      x=0
      if a !=None and b != None and c != None:
         x = a+b+c
      elif a !=None and b != None and c == None:
         x = a+b
      return x

obj = example()

print (obj.add(10,20,30))
print (obj.add(10,20))

它将产生以下输出

60
30

通过这种变通方法,我们能够在 Python 类中加入方法重载。

使用 MultipleDispatch 实现方法重载

Python 的标准库没有其他实现方法重载的规定。但是,我们可以为此目的使用名为MultipleDispatch 的第三方模块中的分派函数。

首先,您需要使用以下命令安装Multipledispatch 模块:

pip install multipledispatch

此模块有一个@dispatch 装饰器。它需要传递给要重载的方法的参数数量。如下所示,使用 @dispatch 装饰器定义 add() 方法的多个副本:

示例

在这个例子中,我们使用 multipledispatch 在 Python 中重载一个方法。

from multipledispatch import dispatch
class example:
   @dispatch(int, int)
   def add(self, a, b):
      x = a+b
      return x
   @dispatch(int, int, int)
   def add(self, a, b, c):
      x = a+b+c
      return x

obj = example()

print (obj.add(10,20,30))
print (obj.add(10,20))

输出

60
30
广告