关于python:定义两个具有相同名称但返回类型不同的方法是否合法?

Is it legal to define two methods with the same name but different returning types?

我写了一段代码来确定一个典型的回文字符串。我通过reverse()方法的定义来实现这一点,方法返回一个字符串。我也渴望有同样的方法,但在虚空的形式,因为一些未来的需要。当我将后者添加到代码中时,有效的输出将变为无效。所以,问题是,用相同的名称定义两个返回类型不同的方法是合法的吗?如果没有,请告诉我如何使用void类型方法编写此代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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()

当我添加注释行时,有效的"是"变为"否"!


写这个是合法的,但它没有定义两种方法。最后一个定义将覆盖第一个定义,因此只有最后一个定义存在,并且将始终调用该定义。就像你一样

1
2
x = 1
x = 2

第一个作业被第二个作业删去了。

至于你更大的问题:拥有两个返回不同事物的方法的方法是用不同的名称定义两个方法。python对函数"打算"返回的类型一无所知。没有"void类型方法"这样的东西。


如果调用两个方法,python将重写所做的第一个方法,只保留定义的第二个方法:

1
2
3
4
5
6
7
8
9
>>> def foo():
...     return 1
...
>>> def foo():
...     return 2
...
>>> foo()
2
>>>

基本上,第二个优先于第一个。

要了解为什么Python会这样做,从常识的角度来看。假设你有一个在线的家庭作业,当你找到它时,有两个同名的作业。你怎么知道该选哪一个?基本上,python只选择最近的一个,这是明智的选择。

另外,在调用函数时,如果两个函数的名称相同,您认为Python将如何理解您想要哪个函数?

Python可能是一种聪明的语言,但它绝不是通灵的:)


如前所述,如果在类中定义第二个方法,第二个定义将覆盖第一个方法,剩下的就是第二个方法。

但是,您可以有一个同名的函数和方法。试试这个:

1
2
3
4
5
6
7
def reverse(detector_object):
    return detector(detector_object.string[::-1])

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

现在,您有了一个名为reverse的函数和一个名为reverse的方法,您可以像sortedsort那样使用它们来列出:

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

将此项与排序列表进行比较:

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

鉴于这反映了一个内置的策略,这很可能是一个可行的方法。


不,python没有方法/函数重载,这是这样一个鉴别操作(在调用级别)的先决条件,而这反过来又允许"两个同名的方法"。

在具有重载的语言中(通常是静态类型),通常不允许返回类型是唯一的鉴别器,甚至是不同的鉴别器——这样做需要考虑结果表达式的用法。

至于这个特殊的问题,我只是不包括"无效形式"。如果需要这样的情况,将其作为一种独特的方法(根据上述限制使用唯一的名称),使其明显地表明目标只是一种没有可用结果的副作用:例如,将EDOCX1的名称(0)与list.sort进行比较。


不,这是不合法的;Python怎么知道该打哪个电话?只需重命名其中一个方法。


您可以通过子类化来做到这一点:

1
2
3
4
5
6
7
8
9
10
class detector(object):
    def __init__(self,string):
        self.string = string
    def reverse(self):
        return self.string[::-1]

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

现在,如果您实例化x = weirdo('hey'),它的行为将是每次调用x.reverse()时永久地反转其字符串值,而类detector的对象将像以前一样继续工作。

(我让weirdo.reverse()也返回新值,这样调用代码就可以始终使用任何类型的对象。)

我不是特别推荐这个,只是演示一种方法。这很可能属于注释,但注释不能真正包含StackOverflow上的代码。