python是没有重载概念的,同名的函数,最后一次的定义会覆盖原有的定义。但是通过python强大的魔法函数,实现出与C++类似的重载效果。

1、参数个数不同的情况

这种情况下的重载, 如果直接按照C++的形式编写,是不会生效的,结果会是最后一个三参数的实现覆盖了前两个实现。

def fun(a):
    print("one param")

def fun(a, b):
    print("two param)

def fun(a, b, c):
    print("three param)

if __name__ == "__main__":
    fun(1)
    fun(1, 2)
    fun(1, 2, 3)

结果如下:

Traceback (most recent call last):
  File "c:\Users\F1V7SM5\Documents\My\demo\fluent.py", line 93, in <module>
    fun(1)
TypeError: fun() missing 2 required positional arguments: 'b' and 'c'

但是我们知道,Python 函数的形参十分灵活,我们可以只定义一个函数来实现相同的功能,就像这样

def fun(*args):
    if len(args) == 1:  
        print("one param")
    elif len(args) == 2:  
        print("two param")
    elif len(args) == 3:  
        print("three param")

2、参数类型不同的情况

from functools import singledispatch

@singledispatch
def fun(a):
    print(a)

@fun.register(int)
def _(a):
    print("Int type: {}".format(a))

@fun.register(str)
def _(a):
    print("str type: {}".format(a))

class tmp:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

@fun.register(tmp)
def _(a):
    print("tmp type: x = {}, y = {}".format(a.x, a.y))

if __name__ == "__main__":
    a = tmp(10, 3)
    fun(10)
    fun("hahah")
    fun(a)

可以得到如下的结果

Int type: 10
str type: hahah
tmp type: x = 10, y = 3

3、参数类型与个数都不一样的情况

这种暂时还没有找到方式去实现