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

时间:2014-05-17 04:42:46

标签: python

我写了一段代码来确定一个典型的回文字符串。我通过返回字符串的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()

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

6 个答案:

答案 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)

不,这不合法; Python如何知道要调用哪一个?只需重命名其中一种方法。

答案 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的方法,您可以将它们用作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)

因为这反映了内置策略,这可能是要走的路。

答案 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上的代码。