在Python中重载的函数?

是否有可能在Python中重载函数? 在C#中,我会做类似的事情

void myfunction (int first, string second) { //some code } void myfunction (int first, string second , float third) { //some different code } 

然后当我调用函数时,它会根据参数的数量来区分两者。 是否有可能在Python中做类似的事情?

编辑对于Python 3.4中的新的单个分派通用函数,请参阅http://www.python.org/dev/peps/pep-0443/

你通常不需要在Python中重载函数。 Python是dynamictypes的 ,支持函数的可选参数。

 def myfunction(first, second, third = None): if third is None: #just use first and second else: #use all three myfunction(1, 2) # third will be None, so enter the 'if' clause myfunction(3, 4, 5) # third isn't None, it's 5, so enter the 'else' clause 

在正常的python你不能做你想要的。 有两个近似的近似值:

 def myfunction(first, second, *args): # args is a tuple of extra arguments def myfunction(first, second, third=None): # third is optional 

然而,如果你真的想这样做,你当然可以做到这一点(冒犯冒犯传统主义者的风险)。 简而言之,您将编写一个wrapper(*args)函数,根据需要检查参数和委托的数量。 这种“黑客”通常是通过装饰器完成的。 在这种情况下,你可以做到这样的事情:

 from typing import overload @overload def myfunction(first): .... @myfunction.overload def myfunction(first, second): .... @myfunction.overload def myfunction(first, second, third): .... 

你可以通过使overload(first_fn) 函数 (或构造函数)返回一个可调用对象来实现这一点,其中__call__(*args) 方法执行上面所述的委托,而overload(another_fn) 方法添加了可以委托给。

你可以在http://acooke.org/pytyp/pytyp.spec.dispatch.html看到一个类似的例子,但是按types重载方法。; 这是一个非常相似的方法…

更新:和类似的东西(使用参数types)正在被添加到python 3 – http://www.python.org/dev/peps/pep-0443/

是的,这是可能的。 我在Python 3.2.1中编写了下面的代码:

 def overload(*functions): return lambda *args, **kwargs: functions[len(args)](*args, **kwargs) 

用法:

 myfunction=overload(no_arg_func, one_arg_func, two_arg_func) 

请注意,由overload函数返回的lambda根据未命名参数的数量select函数进行调用。

解决scheme并不完美,但目前我不能写更好的东西。

不可能直接。 你可以在给定的参数上使用显式types检查,虽然这通常是皱眉。

Python是dynamic的。 如果您不确定对象可以做什么,只需尝试:并调用一个方法,然后除了:错误。

如果你不需要根据types重载,而只需要根据参数的数目来使用关键字参数。

python中的重载方法很棘手。 但是,可能会使用传递字典,列表或原始variables。

我已经为我的用例尝试了一些东西,这可以帮助理解人们重载方法。

让我们把这个例子用在一个stackoverflow线程中:

一个类的重载方法可以调用不同类的方法。

def add_bullet(sprite=None, start=None, headto=None, spead=None, acceleration=None):

从远程类传递参数:

add_bullet(sprite = 'test', start=Yes,headto={'lat':10.6666,'long':10.6666},accelaration=10.6}

add_bullet(sprite = 'test', start=Yes,headto={'lat':10.6666,'long':10.6666},speed=['10','20,'30']}

所以,对于列表,字典或者方法重载的原始variables,正在实现处理。

尝试一下你的代码