63

正如函数重载所说:

Python 中没有函数重载。

就我而言,这是一个很大的障碍,因为它也是一种面向对象(OO)的语言。最初我发现无法区分参数类型很困难,但是 Python 的动态特性使它变得容易(例如,列表、元组、字符串非常相似)。

但是,计算传递的参数数量然后执行这项工作就像是矫枉过正。

4

5 回答 5

36

现在,除非您尝试使用 Python 语法编写 C++ 代码,否则您需要重载什么?

我认为恰恰相反。重载只是使强类型语言的行为更像 Python 所必需的。在 Python 中,您有关键字参数,并且有*argsand **kwargs

参见例如:什么是在 Python 中拥有多个构造函数的干净的 Pythonic 方式?

于 2009-04-09T09:36:49.093 回答
33

正如 unwind 所指出的,具有默认值的关键字参数可以走很长的路。

我还要声明,在我看来,过多地担心将哪些类型传递给方法,这违背了 Python 的精神。在 Python 中,我认为使用鸭子类型更容易接受——询问对象可以做什么,而不是它是什么。

因此,如果您的方法可以接受字符串或元组,您可以执行以下操作:

def print_names(names):
    """Takes a space-delimited string or an iterable"""
    try:
        for name in names.split(): # string case
            print name
    except AttributeError:
        for name in names:
            print name

然后您可以执行以下任一操作:

print_names("Ryan Billy")
print_names(("Ryan", "Billy"))

尽管这样的 API 有时表明存在设计问题。

于 2009-04-09T09:48:07.273 回答
22

您不需要函数重载,因为您有 *args 和 **kwargs 参数。

事实上,函数重载是基于传递不同类型将执行不同代码的想法。如果你有像 Python 这样的动态类型语言,你不应该按类型区分,但你应该处理接口及其与你编写的代码的一致性。

例如,如果您有可以处理整数或整数列表的代码,您可以尝试对其进行迭代,如果您不能,那么您假设它是一个整数并继续前进。当然它可以是一个浮点数,但就行为而言,如果浮点数和整数看起来相同,那么它们可以互换。

于 2009-04-09T08:52:36.517 回答
6

通常,您会看到建议使用带有默认值的关键字参数。调查一下。

于 2009-04-09T08:08:34.097 回答
6

您可以将可变容器数据类型传递给函数,它可以包含您想要的任何内容。

如果您需要不同的功能,请以不同的方式命名函数,或者如果您需要相同的接口,只需编写一个接口函数(或方法),根据接收到的数据适当地调用函数。

我花了一段时间来适应来自 Java 的这种情况,但这确实不是一个“大障碍”。

于 2009-04-09T08:53:55.233 回答