当前位置: 首页 > 知识库问答 >
问题:

如何在Python中使用方法重载?

潘银龙
2023-03-14

我正在尝试用Python实现方法重载:

class A:
    def stackoverflow(self):    
        print 'first method'
    def stackoverflow(self, i):
        print 'second method', i

ob=A()
ob.stackoverflow(2)

但输出是第二种方法2;同样地:

class A:
    def stackoverflow(self):    
        print 'first method'
    def stackoverflow(self, i):
        print 'second method', i

ob=A()
ob.stackoverflow()

给予

Traceback (most recent call last):
  File "my.py", line 9, in <module>
    ob.stackoverflow()
TypeError: stackoverflow() takes exactly 2 arguments (1 given)

我该怎么做呢?

共有3个答案

邵文乐
2023-03-14

虽然agf在过去3.4之前的答案是正确的,但现在使用PEP-3124,我们得到了我们的语法糖。

有关< code>@overload decorator的详细信息,请参阅类型文档,但请注意,这实际上只是语法上的问题,而且,从那以后,人们一直在争论这个问题。

就个人而言,我同意拥有具有不同签名的多个函数使其更具可读性,然后让具有20个参数的单个函数全部设置为默认值(大多数时间都没有),然后必须摆弄使用无休止的ifelifelse链来找出调用方实际上希望我们的函数如何处理提供的参数集。这在蟒蛇禅之后早就应该这样做了:

美丽胜过丑陋。

也可以说

简单比复杂好。

直接来自上面链接的官方Python文档:

from typing import overload
@overload
def process(response: None) -> None:
    ...
@overload
def process(response: int) -> Tuple[int, str]:
    ...
@overload
def process(response: bytes) -> str:
    ...
def process(response):
    <actual implementation>

编辑:对于任何想知道为什么这个例子不像你所期望的那样工作的人,如果是其他语言,我建议看看这个讨论。< code>@overloaded函数不应该有任何实际的实现。从Python文档中的例子来看,这并不明显。

哈翔
2023-03-14

您也可以使用pythonLanguage til:

from pythonlangutil.overload import Overload, signature

class A:
    @Overload
    @signature()
    def stackoverflow(self):    
        print 'first method'

    @stackoverflow.overload
    @signature("int")
    def stackoverflow(self, i):
        print 'second method', i
宋鸿云
2023-03-14

这是方法重载,而不是方法重写。在Python中,历史上所有这些都是在一个函数中完成的:

class A:
    def stackoverflow(self, i='some_default_value'):
        print 'only method'

ob=A()
ob.stackoverflow(2)
ob.stackoverflow()

请参阅 Python 教程的默认参数值部分。请参阅“最小惊讶”和可变默认参数,了解要避免的常见错误。

有关Python 3.4中添加的单个调度泛型函数的信息,请参阅PEP 443:

>>> from functools import singledispatch
>>> @singledispatch
... def fun(arg, verbose=False):
...     if verbose:
...         print("Let me just say,", end=" ")
...     print(arg)
>>> @fun.register(int)
... def _(arg, verbose=False):
...     if verbose:
...         print("Strength in numbers, eh?", end=" ")
...     print(arg)
...
>>> @fun.register(list)
... def _(arg, verbose=False):
...     if verbose:
...         print("Enumerate this:")
...     for i, elem in enumerate(arg):
...         print(i, elem)
 类似资料:
  • 本文向大家介绍在Java中使用方法重载,包括了在Java中使用方法重载的使用技巧和注意事项,需要的朋友参考一下 一个类可以有多个具有相同名称的方法,但方法的参数列表不应相同。这称为方法重载。方法重载有点类似于构造函数重载。 演示此的程序如下所示- 示例 输出结果 现在让我们了解上面的程序。 在方法重载的实现中,使用三种方法创建PrintValues类。其中一个采用int类型的参数,另一个采用dou

  • 问题内容: 正在将tkinter用于gui,我在使用之后方法时遇到麻烦。目的是使每5秒出现一个随机字母。 这是我的代码: 有人可以帮我吗—问题肯定是frame.after(500):我不确定使用“ frame”是否正确,我也不知道500后面是哪个参数。 问题答案: 您需要给定一个在时间延迟后要调用的函数,作为第二个参数after: 注册在给定时间后调用的警报回调。 因此,您真正想要做的是: 您还需

  • 问题内容: 我是Java的初学者,我正在阅读有关如何通过键盘上的方法为变量赋值的主题。书中给出的程序如下: 我想问以下问题: 以下语句做了什么? 如果是的对象,那么什么是新的,并且上述声明右侧的声明做了什么? 为什么使用不同的方法将整数值放入intnumber和将float值放入floatnumber? 问题答案: 我建议您不要使用。专门为此目的设计并在Java 5中引入。请参阅以下链接以了解如何

  • 问题内容: 有人可以向我解释该类中定义的方法的概念吗?它是如何使用的,目的是什么? 问题答案: 从文档: 返回对象的字符串表示形式。通常,该 方法返回一个“以文本形式表示”此对象的字符串。结果应该是简洁易懂的表示形式,便于人们阅读。建议所有子类都重写此方法。 用于类的方法 返回一个字符串,该字符串由对象作为实例的类的名称,符号字符“ @”和对象的哈希码的无符号十六进制表示组成。换句话说,此方法返回

  • 本文向大家介绍如何在jQuery中使用jQuery.insertAfter()方法?,包括了如何在jQuery中使用jQuery.insertAfter()方法?的使用技巧和注意事项,需要的朋友参考一下 insertAfter(selector)方法将所有匹配的元素插入另一个指定的元素集之后。 这是此方法使用的所有参数的描述- selector 选择器 -插入所选元素之后的内容。 示例 您可以尝试

  • 本文向大家介绍如何在jQuery中使用jQuery.wrapInner()方法?,包括了如何在jQuery中使用jQuery.wrapInner()方法?的使用技巧和注意事项,需要的朋友参考一下 该方法使用DOM元素包装每个匹配元素(包括文本节点)的内部子内容。 这是此方法使用的所有参数的描述- html- 将围绕目标包装的DOM元素。 示例 您可以尝试运行以下代码以了解如何在jQuery中使用j