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

回复内容:
这个问题,最近在 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]: http://www.artima.com/weblogs/viewpost.jsp?thread=101605
还有别的语言支持这么变态的特性吗?请问: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:

……这比重载更复杂吗?

Posted in 未分类

发表评论