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

Python 定义两个名称相同但返回类型不同的方法是否合法?,python,Python,我已经编写了一段代码来确定一个典型的回文字符串。我是通过定义一个返回字符串的reverse()方法来实现的。我也渴望有同样的方法,但由于未来的一些需要,这种方法是无效的 当我将后者添加到代码中时,有效的输出将变得无效。定义两个名称相同但返回类型不同的方法是否合法 如果不是,如何使用void-type方法编写此代码 class detector(object): def __init__(self,string): self.string = string for

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

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

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

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

如果调用两个方法,Python将覆盖第一个方法,只定义第二个方法:

>>> def foo():
...     return 1
...
>>> def foo():
...     return 2
...
>>> foo()
2
>>>
基本上,第二个优先于第一个

要了解Python为什么会这样做,请从常识的角度来理解它。假设你有一个在线作业,当你找到它时,有两个同名的作业。你怎么知道该选哪一个?基本上,Python只选择最近的一个,这是一个明智的选择

另外,在调用函数时,如果它们的名称相同,您认为Python如何理解您想要哪个函数


Python可能是一种智能语言,但它决不是通灵的:)

如果调用两个方法,Python将覆盖第一个方法,只定义第二个方法:

>>> def foo():
...     return 1
...
>>> def foo():
...     return 2
...
>>> foo()
2
>>>
基本上,第二个优先于第一个

要了解Python为什么会这样做,请从常识的角度来理解它。假设你有一个在线作业,当你找到它时,有两个同名的作业。你怎么知道该选哪一个?基本上,Python只选择最近的一个,这是一个明智的选择

另外,在调用函数时,如果它们的名称相同,您认为Python如何理解您想要哪个函数


Python可能是一种聪明的语言,但它绝不是通灵的:)

编写这种语言是合法的,但它没有定义两种方法。最后一个定义覆盖了第一个定义,因此只有最后一个定义存在,并且将始终调用该定义。这和你做的一样

x = 1
x = 2
第一个作业被第二个作业抹掉


至于更大的问题:让两个方法返回不同的东西的方法是用不同的名称定义两个方法。Python对函数“打算”返回的类型一无所知。没有“void-type方法”这样的东西。

这样写是合法的,但它没有定义两种方法。最后一个定义覆盖了第一个定义,因此只有最后一个定义存在,并且将始终调用该定义。这和你做的一样

x = 1
x = 2
第一个作业被第二个作业抹掉

至于更大的问题:让两个方法返回不同的东西的方法是用不同的名称定义两个方法。Python对函数“打算”返回的类型一无所知。没有“void-type方法”这样的东西。

no.Python,这是这种区分操作(在调用级别)的先决条件,它反过来允许“两个同名方法”

在具有重载的语言中,通常是静态类型的,通常禁止返回类型作为唯一的鉴别器,甚至是差异-这样做需要考虑结果表达式的使用

至于这个问题,我不想把“无效表格”包括在内。如果需要这种情况,则将其作为一种独特的方法(根据上述限制使用唯一的名称),使其明显表明目标只是一种副作用,而没有可用的结果:例如,将
sorted
的名称与
list.sort

No.Python进行比较,这是进行这种区分操作的先决条件(在调用级别),这反过来又允许“两个具有相同名称的方法”

在具有重载的语言中,通常是静态类型的,通常禁止返回类型作为唯一的鉴别器,甚至是差异-这样做需要考虑结果表达式的使用


至于这个特殊的问题,我不会简单地包括“void form”。如果需要这种情况,请将其作为一个独特的方法(根据上述限制使用唯一的名称)这表明目标只是一个没有可用结果的副作用:例如,将
sorted
的名称与
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)

鉴于这反映了一种内置的策略,这可能是一种方法。

正如已经指出的,如果在类中定义第二个方法,第二个定义将覆盖第一个方法,剩下的就是第二个方法

但是,可以使用相同名称的函数和方法。请尝试以下操作:

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)
鉴于这反映了一种内在的战略,这可能是