[英]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.