当前位置:Gxlcms > Python > 为什么Python不支持函数重载?

为什么Python不支持函数重载?

时间:2021-07-01 10:21:17 帮助过:44人阅读

回复内容:

这个问题,最近在 cpyug 上面讨论得很火热。我简要概括一下。

为了考虑为什么 python 不提供函数重载,首先我们要研究为什么需要提供函数重载。

函数重载主要是为了解决两个问题。
1。可变参数类型。
2。可变参数个数。

另外,一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如果两个函数的功能其实不同,那么不应当使用重载,而应当使用一个名字不同的函数。

好吧,那么对于情况 1 ,函数功能相同,但是参数类型不同,python 如何处理?答案是根本不需要处理,因为 python 可以接受任何类型的参数,如果函数的功能相同,那么不同的参数类型在 python 中很可能是相同的代码,没有必要做成两个不同函数。

那么对于情况 2 ,函数功能相同,但参数个数不同,python 如何处理?大家知道,答案就是缺省参数。对那些缺少的参数设定为缺省参数即可解决问题。因为你假设函数功能相同,那么那些缺少的参数终归是需要用的。

好了,鉴于情况 1 跟 情况 2 都有了解决方案,python 自然就不需要函数重载了。 我补充一点,Python3是可以通过metaclass + parameter annotation使某个类假装支持function overloading
class Spam(metaclass=MultipleMeta):
    def bar(self, x:int, y:int):
        print('Bar 1:', x, y)
    def bar(self, s:str, n:int = 0):
        print('Bar 2:', s, n)

# Example: overloaded __init__
import time
class Date(metaclass=MultipleMeta):
    def __init__(self, year:int, month:int, day:int):
        self.year = year
        self.month = month
        self.day = day

    def __init__(self):
        t = time.localtime()
        self.__init__(t.tm_year, t.tm_mon, t.tm_mday)
谁说不支持了?自己实现个简易的 multiple dispatch 不就完了。Guido 七年前就给了范例了 [1]。同学们要多读书,不要随便被问题挖的坑给埋了……

静态语言需要 function overloading 主要是为了解决调用灵活性的问题,Python 这么灵活的脚本语言用 function overloading 纯属多此一举。

[1]: artima.com/weblogs/view 还有别的语言支持这么变态的特性吗?请问:
cos(float) cos(double) 和 cosf(float) cosd(double) 两者相比,前者的易用性在哪?能让代码更简洁? Python支持可选参数,比如
def func( a, b = 0, c = 0 ):
pass
那么,形如func(1),func(1,2),func(1,2,3)或者func(a=1, b=2)这样的调用都是合法的,这种情况下函数重载就显得鸡肋了。
个人以为,一个语言选择重载或者可选参数两者中的一种就是了。像C# 4这样同时支持这两种形式的,就比较容易混淆。 phython是dynamic binding, 就是说已经可以随便重载,不需要专门定义重载 你错了, 重载overload不是多态的overwrite。 重载是指用相同的函数名,但是参数列表不同(类型和个数), 是不需要虚函数也不需要额外开销的,是在编译期由编译器重命名函数。如 int f(int) , int f(float); 编译其可能函数名变为int f_i_1(int) 和 int f_f_1(float). 脚本语言不需要重载机制是入参本身的类型就不是确定的,既然类型可以是任意 也就带不来性能上的提高, 就无意义了。 比如python的 sub f(a): , 任意的类型都可以用来刁用f def max(**kwargs) 可用。 因为python是动态语言 为啥不行?

def max(a,b,c='nothing'):

if c=='nothing':

if a > b:

print a

else:

print b

else:


......
这比重载更复杂吗?

人气教程排行