Python3 方法重载

在Python中,具有重载的思想却没有重载的概念。Python是一门动态语言,不需要声明变量类型,函数中可以接受任何类型的参数也就无法根据参数类型来支持重载,Python没有必要去考虑参数的类型问题,这些都可以在函数内部判断处理,并无必要去再写一个函数。Python 有多种传参方式,位置参数/可变参数/可变关键字参数可以处理函数参数中参数可变的问题。

在Python中,如下的代码并不能实现方法重载:

def method1():
    pass
def method1(a):
    pass
def method1(a,b):
    pass
#这里想调用 method1 的无参数版本,但是解释器会报错,提示找不到 method1 方法
method1()

为什么会出现这种违法静态语言直觉的结果?因为,在Python中,方法也是attribute,方法名就是key,所以每个方法名只能有一个方法体,以上代码中,当method1被定义了多次,每一次新的定义都会覆盖之前的定义,所以,可以在dir()中看到,method1最终指向的函数体是method1(a,b),但解释器发现调用method1时却缺少两个参数,所以会报错。

Python中提供一个转发机制来实现重载:

from functools import singledispatch
@singledispatch
def function(obj):
    print('%r'%(obj))
@function.register(int)
def function_to(obj):
    print('Integer: %d'%(obj))
@function.register(str)
def function_to(obj):
    print('String: %s'%(obj))
@function.register(list)
def function_to(obj):
    print('List: %r'%(obj))
if __name__ == "__main__":
    function(100)
    function('hello python')
    function(list(range(10)))
    function(10.5)

结果:

Integer: 100
String: hello python
List: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
10.5
Python3 方法重载

发表评论

邮箱地址不会被公开。 必填项已用*标注

84 ÷ = 八十 四

滚动到顶部