python中的函数重载:Missing

Function overloading in Python: Missing

他说:这

web.archive.org http:/ / / / / 20090624083829网站http://mail.python.org pipermail Python列表/ / / / 206149.html 2003年5月

在Python函数重载是缺席。

只要我觉得这一大障碍,因为它是面向对象的语言。最初我发现无法differentiate实参类型之间没有什么不自然的Python动态制造轻松(例如列表、元组,字符串是多相似)。

然而数计数的参数传递,然后像做工作是必要的。


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

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

例如,请参见:在python中使用多个构造函数的一种干净的python方法是什么?


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

我还将声明,在我看来,非常担心什么类型被传递到方法中违背了Python的精神。在Python中,我认为使用duck类型更为普遍——询问对象可以做什么,而不是问它是什么。

因此,如果您的方法可以接受一个字符串或元组,您可以这样做:

1
2
3
4
5
6
7
8
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

然后你可以这样做:

1
2
print_names("Ryan Billy")
print_names(("Ryan","Billy"))

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


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

事实上,函数重载是基于这样一种思想:传递不同的类型,您将执行不同的代码。如果您有一种动态类型语言(如python),那么您不应该根据类型来区分,而是应该处理接口及其与您编写的代码的一致性。

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


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

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

我花了一段时间才适应了来自Java的这一点,但它并不是一个"大障碍"。


通常,您会看到建议使用带有默认值的关键字参数。看看那个。