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,这样它就可以与一个、两个或三个参数一起使用。

例子

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 类中合并方法重载。

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

首先,您需要安装 Multipledispatch 模块。

pip install multipledispatch

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

例子

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