[英]Is it legal to define two methods with the same name but different returning types?
我写了一段代码来确定一个典型的回文字符串。 我通过定义一个返回字符串的 reverse() 方法来做到这一点。 我也很想拥有同样的方法,不过是虚空形态,因为未来的一些需要。
当我将后者添加到代码中时,有效输出将变为无效。 定义两个名称相同但返回类型不同的方法是否合法?
如果没有,我如何使用 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()
当我添加注释行时,有效的“是”变为“否”!
如果你调用两个方法,Python 将覆盖第一个,只留下定义的第二个:
>>> def foo():
... return 1
...
>>> def foo():
... return 2
...
>>> foo()
2
>>>
基本上,第二个覆盖第一个。
要了解Python为何会这样做,请从常识的角度来看。 假设你有一个在线作业,当你找到它时,有两个同名的作业。 你怎么知道选哪一个? 基本上, Python只会选择最新的,这是明智的选择。
另外,在调用函数时,如果它们都具有相同的名称,您认为 Python 将如何理解您想要哪个?
Python 可能是一种聪明的语言,但它绝不是通灵的 :)
写那个是合法的,但它没有定义两个方法。 最后一个定义覆盖了第一个定义,因此只有最后一个存在并且将始终调用该定义。 就像你做的一样
x = 1
x = 2
第一个任务被第二个任务抹去。
至于你更大的问题:让两个方法返回不同的东西的方法是定义两个不同名称的方法。 Python 对函数“打算”返回的类型一无所知。 没有“空型方法”这样的东西。
号的Python 没有方法/函数重载,这是这样的判别操作的先决条件(在调用电平),这又允许“两种方法具有相同的名称”。
在具有重载的语言中,通常是静态类型的,通常禁止将返回类型作为唯一的鉴别器甚至不同 - 这样做需要考虑结果表达式的使用。
就这个特定问题而言,我根本不会包括“无效形式”。 如果需要这种情况,请使其成为一个独特的方法(根据上述限制具有唯一的名称),以明确目标只是没有可用结果的副作用:例如,将sorted
的名称与list.sort
进行比较list.sort
。
如前所述,如果您在类中定义第二个方法,第二个定义会覆盖第一个,剩下的就是第二个。
但是,您可以拥有同名的函数和方法。 尝试这个:
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)
看到这反映了一个内置的策略,这可能是要走的路。
不,这是不合法的; Python 怎么知道要调用哪一个? 只需重命名其中一种方法即可。
你可以通过子类化来做到这一点:
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 上的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.