函数重载是什么
定义多个同名函数,但其参数的顺序或命名不同,在调用时,根据提供的参数进行调用,返回对应的值。
不同语言对比
C++:
int square(int a)
{
return x * x;
}
float square(float b)
{
return x * x;
}
在调用square 函数时,边长类型不一样,返回值也不一样。 如: square(5) ,返回值25 square(5.0) ,返回值25.0 而python3:
def square(a: int):
return x * x
def square(b: float):
return x * x
square(5) ,返回值25.0 square(5.0) ,返回值25.0 square(a=5) ,直接报错。 造成这样的原因是python中函数视作一个变量,定义同名函数相当于重定义。
python实现原理
python中的类有一个方法叫__call__ ,指当被调用时的方法。 简单的实现:
class Square(object):
def __init__(self):
pass
def __call__(self, *args, **kwargs):
if 'a' in kwargs:
return kwargs['a'] * kwargs['a']
if 'b' in kwargs:
return kwargs['b'] * kwargs['b']
square = Square()
square(a=1)
square(b=2)
代码实现函数重载
import copy
functions = {}
class OverloadFunction(object):
def __init__(self, func):
self.name = func.__name__
if self.name in functions:
functions[self.name].append(copy.deepcopy(func))
else:
functions[self.name] = [copy.deepcopy(func)]
def __call__(self, *args, **kwargs):
func_list = functions[self.name]
for func in func_list:
try:
return func(*args, **kwargs)
except:
pass
raise ValueError
def overload(func):
return OverloadFunction(func)
使用例子
@overload
def square(a):
return a * a
@overload
def square(b):
return b * b
print(square(a=1))
print(square(b=2))
|