我写了一段代码来确定一个典型的回文字符串。我通过返回字符串的reverse()方法的定义来做到这一点。我也渴望拥有相同的方法,但是在虚空形式中,因为未来的某些需求。 当我将后者添加到代码中时,有效输出将变为无效。 所以,问题是定义两个具有相同名称但返回类型不同的方法是否合法? 如果没有,请告诉我如何使用void-type方法编写此代码。
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()
当我添加注释行时,有效的“是”变为“否”!
答案 0 :(得分:6)
如果你调用两个方法,python将覆盖第一个方法,只留下第二个方法:
>>> def foo():
... return 1
...
>>> def foo():
... return 2
...
>>> foo()
2
>>>
基本上,第二个会覆盖第一个。
要了解为什么 python 会这样做,请从常识的角度来看。假设你有一个在线的家庭作业,当你到达时,有相同名称的两个作业。你怎么知道选哪一个?基本上, python 只选择最新的一个,这是明智的选择。
另外,调用函数时,你怎么认为如果python都具有相同的名称,它们会理解你想要哪一个?
Python可能是一种智能语言,但它绝不是通灵的:)
答案 1 :(得分:6)
写这个是合法的,但它没有定义两种方法。最后一个定义会覆盖第一个定义,因此只存在最后一个定义,并且始终会调用一个定义。它就像你做的一样
x = 1
x = 2
第一项任务被第二项任命抹掉。
至于你更大的问题:让两个返回不同东西的方法的方法是定义两个具有不同名称的方法。 Python对函数“打算”返回的类型一无所知。没有“空洞式方法”这样的东西。
答案 2 :(得分:2)
答案 3 :(得分:2)
没有。 Python does not have method/function overloading,这是区分操作的先决条件(在调用级别),这反过来允许“两个具有相同名称的方法”。
在具有重载的语言(通常是静态类型)中,通常禁止将返回类型作为唯一的鉴别符,或者甚至是不同的 - 这样做会要求结果表达式的用法被考虑在内。
就这个特殊问题而言,我只是不包括“void form”。如果需要这样的情况,请使其成为一种独特的方法(每个上述限制具有唯一名称),这使得目标显然只是一个没有可用结果的副作用:例如,比较{{1}的名称与sorted
。
答案 4 :(得分:2)
正如已经指出的,如果你在一个类中定义第二个方法,第二个定义将覆盖第一个方法,剩下的所有方法都是第二个方法。
但是,您可以拥有一个具有相同名称的函数和方法。试试这个:
def reverse(detector_object):
return detector(detector_object.string[::-1])
class detector(object):
...
def reverse(self):
self.string = self.string[::-1]
现在您有一个名为reverse
的函数和一个名为reverse
的方法,您可以将它们用作sorted
和sort
列表:
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)
因为这反映了内置策略,这可能是要走的路。
答案 5 :(得分:1)
你可以通过继承:
来做到这一点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上的代码。