在考虑为什么Python不提供函数重载前,我们要研究为什么需要提供函数重载。
在静态语言中,方法重载是希望类可以以统一的方式处理不同类型的数据提供可能性。多个同名函数同时存在
函数重载主要解决两个问题:
- 可变参数类型
- 可变参数个数
另外,一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如果两个函数的功能其实不同,那么不应当使用重载,而应当使用一个名字不同的函数。
对于情况 1 ,函数功能相同,但是参数类型不同,python 如何处理?答案是根本不需要处理,因为 python 可以接受任何类型的参数,如果函数的功能相同,那么不同的参数类型在 python 中很可能是相同的代码,没有必要做成两个不同函数。
对于情况 2 ,函数功能相同,但参数个数不同,python 如何处理?大家知道,答案就是缺省参数。对那些缺少的参数设定为缺省参数即可解决问题。因为你假设函数功能相同,那么那些缺少的参数终归是需要用的。
鉴于情况1跟情况2都有了解决方案,python 自然就不需要函数重载了。
在静态语言中,方法重载是希望类可以以统一的方式处理不同类型的数据提供可能。多个同名函数同时存在,具有不同的参数个数/类型,重载是一个类中多态性的一种表现。
在动态语言中,有鸭子类型,如果走起路来像鸭子,叫起来也像鸭子,那么它就是鸭子。一个对象的特征不是由它的类型决定,而是通过对象中的方法决定,所以函数重载在动态语言中就显得没有意义了,因为函数可以通过鸭子类型来处理不同类型的对象,鸭子类型也是多态性的一种表现。
在python中实现重载:
class Writer:
@staticmethod
def write(output, content):
# output对象只要实现了write方法就行了
output.write(content)
# stringIO类型
output = StringIO.StringIO()
Writer.write(output, "helloworld")
# file类型
output = open("out.txt", "w")
Writer.write(output, "helloworld")
重载:函数名相同,函数的参数个数、参数类型或参数顺序三者中必须至少有一种不同。函数返回值的类型可以相同,也可以不相同。发生在一个类内部。
重定义:也叫做隐藏,子类重新定义父类中有相同名称的非虚函数 ( 参数列表可以不同 ) ,指派生类的函数屏蔽了与其同名的基类函数。发生在继承中。
重写:也叫做覆盖,一般发生在子类和父类继承关系之间。子类重新定义父类中有相同名称和参数的虚函数。