代码之家  ›  专栏  ›  技术社区  ›  Xolve

python中的函数重载:缺少[closed]

  •  61
  • Xolve  · 技术社区  · 16 年前

    正如这样说的:

    http://web.archive.org/web/20090624083829/http://mail.python.org/pipermail/python-list/2003-May/206149.html

    Python中不存在函数重载。

    据我所知,这是一个很大的障碍,因为它也是一种OO语言。最初,我发现无法区分参数类型很困难,但python的动态特性使它变得容易(例如,list、tuples、strings非常相似)。

    然而,计算传递的参数的数量,然后执行该任务就好像是一种过度杀戮。

    5 回复  |  直到 8 年前
        1
  •  33
  •   Ryan Ginstrom    16 年前

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

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

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

    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有时表示存在设计问题。

        2
  •  37
  •   Community CDub    7 年前

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

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

    例如,请参见: What is a clean, pythonic way to have multiple constructors in Python?

        3
  •  22
  •   Stefano Borini    16 年前

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

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

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

        4
  •  6
  •   unwind    16 年前

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

        5
  •  6
  •   lprsd    16 年前

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

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

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