Python - 方法重载



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

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 的第三方模块的 dispatch 函数。

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

pip install multipledispatch

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

在此示例中,我们使用 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