Python中的函数重载:缺少[关闭]

Posted

技术标签:

【中文标题】Python中的函数重载:缺少[关闭]【英文标题】:Function overloading in Python: Missing [closed] 【发布时间】:2010-10-18 12:14:14 【问题描述】:

正如 function overloading 所说:

Python 中没有函数重载。

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

但是,计算传递的参数数量然后执行这项工作就像是大材小用。

【问题讨论】:

所以?你认为你需要重载做什么? 投票结束不是一个真正的问题。这并不是说这不是一个潜在的有效点,但这不是一个问题。 也投票结束。这是一个隐含的问题或咆哮,其中任何一个都很难回答。 如果我刚刚添加了一个问题——“任何 Pythonic 方式来做到这一点?”。但是我觉得我的帖子中暗示了这一点。 @Xolve 显式优于隐式。 【参考方案1】:

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

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

例如:What is a clean, Pythonic way to have multiple constructors in Python?

【讨论】:

您对重载是“残障语言的黑客工作” 的评估似乎过于两极分化,并且忽略了静态类型的好处,以及它对不同类型部署的适用性。 Stefano Borini's answer 那 "..function 重载是基于传递不同类型你将执行不同代码的思想。如果你有像 python 这样的动态类型语言,你不应该按类型区分" 更多我认为内容丰富且很有帮助。 当然,您也可以在 C++ 中使用可变参数,但重载用于保持代码干净。例如,一个函数只做一件事,而不是让一个函数散布着 if 语句,试图根据传入的内容找出要做什么。【参考方案2】:

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

【讨论】:

那么请举一个没有设计问题的例子。 当然,这有点做作,但它汇总了一个 int/str 列表并认为 [a-z]/i 的值是 1-26:gist.github.com/cmattoon/abeed5fb8367b0b869cf【参考方案3】:

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

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

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

【讨论】:

重载不仅与类型有关,还与参数数量有关。例如,我可能希望我的访问器和修改器(或“getter”和“setter”,如果你愿意的话)共享一个方法名,但它们显然基于参数的存在做不同的事情。这与参数的类型无关。【参考方案4】:

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

【讨论】:

【参考方案5】:

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

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

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

【讨论】:

以上是关于Python中的函数重载:缺少[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

构造函数重载 - Java 中的最佳实践 [关闭]

Python中的重载函数

Python中的重载函数

python中函数重载和重写

python 类中的运算符和函数重载

Python 没有函数重载?如何用装饰器实现函数重载?