在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 方法重载