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