定义两个同名但返回类型不同的方法是否合法?

3 投票
6 回答
8135 浏览
提问于 2025-04-18 06:50

我写了一段代码来判断一个字符串是否是回文。回文就是正着读和反着读都一样的字符串。我是通过定义一个叫做reverse()的方法来实现的,这个方法会返回一个字符串。我还想要一个不返回任何东西的版本,也就是void类型的方法,因为将来可能会用到。

但是,当我把这个不返回东西的方法加到代码里后,原本有效的输出就变成无效了。请问,定义两个同名的方法但返回类型不同,这样做合法吗?

如果不合法,那我该怎么写这个void类型的方法呢?

class detector(object):
    def __init__(self,string):
        self.string = string

    forbidden = (' ','!','?','.','-','_','&','%',"#",",")

    def eliminator(self):
        for item in self.forbidden:
            if item in self.string:
                self.string = self.string.replace(item,"")

    def reverse(self):
        return self.string[::-1]

    #def reverse(self):
    #    self.string = self.string[::-1]    I am prone to add this method

    def check(self):
        reversed = self.reverse()
        if self.string == reversed:
            print("Yes")
        else:
            print("No")

det = detector("rise to vote, sir!")
det.eliminator()
det.check()

当我加上那些注释掉的代码行后,原本有效的“是”就变成“不是”了!

6 个回答

1

不,这样做是不合法的;Python怎么知道该调用哪个方法呢?你只需要把其中一个方法改个名字就行了。

2

不,Python 并没有方法/函数的 重载,这意味着在调用时不能有“两个同名的方法”。

在一些支持重载的编程语言中,通常是静态类型的,返回值类型不能单独作为区分的依据,甚至不能仅仅因为返回值不同就允许重载——这样做的话,就需要考虑到结果表达式的使用情况。

针对这个特定的问题,我建议 不要包含 “无返回值的形式”。如果确实需要这种情况,可以创建一个独立的方法(并且要有一个独特的名字,遵循上面的限制),这样就能清楚地表明这个方法的目的是产生副作用,而不是返回一个可用的结果。例如,可以对比一下 sortedlist.sort 的名字。

5

如果你调用了两个方法,Python 会把第一个方法给覆盖掉,只保留第二个方法:

>>> def foo():
...     return 1
...
>>> def foo():
...     return 2
...
>>> foo()
2
>>>

简单来说,第二个方法会“覆盖”第一个方法。

要理解为什么 Python 会这样做,可以从常识的角度来看。假设你有一个在线的作业,当你打开的时候,发现有两个同名的作业。你怎么知道该选哪个呢?其实,Python 就是选择最新的那个,这样做是比较聪明的选择。

而且,在调用这个函数的时候,你觉得 Python 怎么知道你想用哪个方法呢,如果它们的名字是一样的?

Python 可能是个聪明的语言,但它可不是心灵感应哦 :)

5

这样写是合法的,但它并没有定义两个方法。最后一个定义会覆盖第一个,所以最后一个方法是唯一存在的,并且总是会被调用。这就像你这样写:

x = 1
x = 2

第一个赋值被第二个覆盖了。

至于你更大的问题:如果想要有两个返回不同结果的方法,就需要定义两个不同名字的方法。Python并不知道一个函数“打算”返回什么类型的结果。没有所谓的“无返回值的方法”。

2

正如之前提到的,如果你在一个类里定义了第二个方法,第二个定义会覆盖第一个,这样最后只会留下第二个。

不过,你可以有一个函数和一个方法同名。试试这个:

def reverse(detector_object):
    return detector(detector_object.string[::-1])

class detector(object):
...
    def reverse(self):
        self.string = self.string[::-1]

现在你有一个叫 reverse 的函数和一个叫 reverse 的方法,你可以像使用列表的 sortedsort 一样来使用它们:

old_detector.reverse() # reverse it in place
new_detector = reverse(old_detector) # return a new detector object with the string reversed

把这和排序一个列表比较一下:

my_list.sort() # sort list in place
new_list = sorted(my_list)

因为这和内置的排序方法很像,所以这可能是个不错的选择。

撰写回答