繁体   English   中英

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

[英]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 ,你会使用他们像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)

看到这反映了一个内置的策略,这可能是要走的路。

不,这是不合法的; 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM