Heim > Backend-Entwicklung > Python-Tutorial > 为什么 Python 不支持函数重载?

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Freigeben: 2016-06-06 16:21:59
Original
1327 Leute haben es durchsucht

回复内容:

这个问题,最近在 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)
Nach dem Login kopieren
谁说不支持了?自己实现个简易的 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:


......
这比重载更复杂吗?
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage