在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,正在实现处理。
尝试一下你的代码