首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python中的函数重载:缺少

Python中的函数重载:缺少
EN

Stack Overflow用户
提问于 2009-04-09 07:57:01
回答 5查看 102.9K关注 0票数 63

正如所说:

Python中没有函数重载。

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

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-04-09 09:48:07

正如unwind所提到的,带有默认值的关键字参数可能会有很大的帮助。

我还会声明,在我看来,过于担心传递到方法中的类型是违背Python精神的。在Python中,我认为更容易接受的方法是使用鸭子类型--询问一个对象能做什么,而不是它是什么。

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
print_names("Ryan Billy")
print_names(("Ryan", "Billy"))

尽管像这样的API有时会指示设计问题。

票数 33
EN

Stack Overflow用户

发布于 2009-04-09 09:36:49

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

我认为情况正好相反。只有在使强类型语言表现得更像Python时,才需要重载。在Python中,您可以使用关键字参数,并且可以使用*args**kwargs

请参见示例:

票数 36
EN

Stack Overflow用户

发布于 2009-04-09 08:52:37

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

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

例如,如果您的代码既可以处理一个整数,也可以处理一组整数,您可以尝试对其进行迭代,如果不能,则假定它是一个整数,然后继续进行。当然,它可以是一个浮点型,但就行为而言,如果一个浮点型和一个整型看起来是一样的,那么它们就可以互换。

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/733264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档