为什么 Python 不支持函数重载?
程序员文章站
2022-04-08 19:45:31
...
回复内容:
这个问题,最近在 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:
......
这比重载更复杂吗?
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
相关文章
相关视频