这个函数是重载还是什么?

时间:2012-03-15 00:46:24

标签: python overloading

def func(a, b, c='four'):
    print 'a is %s, b is %s, c is %s' %(a, b ,c)

func('one','two','three')
func('one', 'two')

此代码运行没有问题。但是这叫什么呢? '过载'?

不过,这种风格只适用于Python吗?谢谢!

4 个答案:

答案 0 :(得分:5)

Python称之为'default argument values'。这是一种非常简单的函数重载形式('arity'上的重载(即函数有多少个参数))。这与Python中的函数重载一样复杂。

由于希望保持语言相当简单以及Python变量在运行时只有类型的事实,Python不能按类型重载。如果你愿意,你可以使用isinstance滚动你自己的重载,但结果代码非常混乱,我不推荐它。

其他语言也有默认参数。例如,C ++也允许使用默认参数,C ++显式将默认参数视为函数重载的一种形式。

与C ++不同的Python默认参数有一点是Python已经命名了参数,这意味着您可以显式覆盖特定的默认值而不会覆盖其他默认值。

例如:

def foo(bar, baz="A baz", qux=0):
    return "(%r, %r, %r)" % (bar, baz, qux)

foo(5)
(5, 'A baz', 0)
foo(5, qux=2)
(5, 'A baz', 2)

还有其他语言允许这样做。我相信,例如,这是Ruby允许的,尽管我不确定语法是什么。

最后,奇怪的是,Python有运算符重载。这是通过属于类的functions with special reserved names来管理的。此类函数的格式始终为__name__。关于运算符重载在任何单个运算符的情况下如何工作的规则可能有点奇怪,我通常建议在大多数情况下不使用此功能,尤其是对于重载数字或关系运算符。

答案 1 :(得分:2)

不,这是default argument values的一个例子。

many languages中提供了默认参数值。

答案 2 :(得分:1)

正如其他人所说,这是默认参数,而不是运算符重载。

Python执行实际运算符重载的方式是使用可以在类中定义的特殊方法函数。因为Python以这种方式实现,所以不可能仅仅基于内置类型来重载操作;您不能重载表达式+中的1 + 1运算符。但是,您可以创建int的子类并重载该子类以执行您想要的任何操作。 MyClass(1) + 1可能会有一个重载+运算符。

有关Python中运算符重载的更多信息:

operator overloading in python

答案 3 :(得分:0)

它被称为默认参数值

这不是仅限Python的功能,一个例子是C ++,还有更多。

Python不支持函数重载(与C ++不同)。函数重载是指具有多个具有相同名称的函数,并且编译器根据传递的参数数量及其类型确定您正在调用的函数。