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] |
现在,您有了一个名为
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)与
不,这是不合法的;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 |
现在,如果您实例化
(我让
我不是特别推荐这个,只是演示一种方法。这很可能属于注释,但注释不能真正包含StackOverflow上的代码。