我知道python不允许我们重载函数。但是,它是否有内置的重载方法?
考虑一下:
setattr(object_name,'variable', 'value')
setattr(class_name,'method','function')
第一个语句在运行时动态地向对象添加变量,但第二个语句在运行时将外部函数附加到类。
相同的函数根据其参数执行不同的操作。这个功能是否过载?
答案 0 :(得分:3)
无论foo的类型如何,函数setattr(foo, 'bar', baz)
始终与foo.bar = baz
相同。这里没有超载。
在Python 3中,functools.singledispatch
可以进行有限的重载,但setattr
没有实现。
在我看来,一个更有趣的例子是type()
。 type()
根据你的称呼方式做两件完全不同的事情:
尽管如此,type()
并未超载。为什么不?因为它是作为counts how many arguments it got的一个函数实现的,然后决定要做什么。在纯Python中,这是使用可变参数*args
语法完成的,但type()
是在C中实现的,因此它看起来非常不同。不过,它正在做同样的事情。
答案 1 :(得分:2)
int add(int x, int y) {
return x + y;
}
如果您希望扩展概念以包含非整数的内容,则需要另外执行其他功能:
float add(float x, float y) {
return x + y;
}
在Python中,您只需要:
def add(x, y):
return x + y
它适用于两者,并且它不被认为是函数重载。您还可以使用isinstance
等方法处理变量类型的不同情况。主要问题as pointed out by this question是类型的数量。但是在你的情况下,你传递的是相同数量的类型,即便如此,还是可以解决这个问题而不需要函数重载。
答案 2 :(得分:0)
重载方法在python中很棘手。但是,可以使用传递dict,list或原始变量。
我已经为我的用例尝试了一些东西,这可以帮助理解人们重载方法。
我们举个例子:
一个类重载方法,调用来自不同类的方法。
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']}
因此,正在从方法重载中实现列表,字典或原始变量的处理。
试试你的代码