这是python函数重载的一个例子吗?

时间:2016-02-03 04:33:19

标签: python overloading

我知道python不允许我们重载函数。但是,它是否有内置的重载方法?

考虑一下:

setattr(object_name,'variable', 'value')

setattr(class_name,'method','function')

第一个语句在运行时动态地向对象添加变量,但第二个语句在运行时将外部函数附加到类。

相同的函数根据其参数执行不同的操作。这个功能是否过载?

3 个答案:

答案 0 :(得分:3)

无论foo的类型如何,函数setattr(foo, 'bar', baz)始终与foo.bar = baz相同。这里没有超载。

在Python 3中,functools.singledispatch可以进行有限的重载,但setattr没有实现。

在我看来,一个更有趣的例子是type()type()根据你的称呼方式做两件完全不同的事情:

  1. 如果使用单个参数调用,则返回该参数的类型。
  2. 如果使用三个参数(正确类型)调用,它会动态创建一个新类。
  3. 尽管如此,type()并未超载。为什么不?因为它是作为counts how many arguments it got的一个函数实现的,然后决定要做什么。在纯Python中,这是使用可变参数*args语法完成的,但type()是在C中实现的,因此它看起来非常不同。不过,它正在做同样的事情。

答案 1 :(得分:2)

从某种意义上说,Python在其他语言的帮助下并不需要函数重载功能。请考虑C中的以下示例:

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']}

因此,正在从方法重载中实现列表,字典或原始变量的处理。

试试你的代码