簡體   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