2017-02-17 92 views
-2

通常我會檢查字符串中是否存在子字符串。在Python,我可以做,要麼使用__contains__()方法或使用in操作,如下圖所示:在Python中,爲什麼contains()是str對象的隱藏方法?

模式1:

string1 = r'c:\users\username\documents\code\crime_data.csv' 
print(string1.__contains__('username')) 

模式2:

print('username' in string1) 

無論是對我工作得很好,但我想知道爲什麼__contains__隱藏的方法,如果模式2首選超過1,如果是的話,爲什麼?其他編程語言(如C#)在其標準庫中有一個String.contains()方法。

+2

爲什麼要編寫'x.contains(y)'而不是''在x''中? '__contains__'是一種神奇的方法,原因與你寫'x + y'而不是'x .__ add __(y)'的原因相同,即在有中綴操作符可用的情況下,它通常比函數調用。 – BrenBarn

+1

當你在something2中調用'something'時,Python在'something2'對象中尋找一個魔術'__contains__'方法並調用它(並且對於一些內建函數,解釋器甚至可以優化掉這樣的調用)。 'in'只是一個語法糖,可以讓代碼更具可讀性。至於爲什麼它是一個單獨的方法 - 所以你可以創建自己的類型,可以與其他類型進行比較。 – zwer

+0

進一步說明BrenBarn所說的'in'運算符也比方法調用快。 – miradulo

回答

3

in運算符可以通過重新定義方法__contains__來重載。 這與例如__add__+),__mul__*)等等。所以重點不在於隱藏該方法,而是爲了使其符合用於重載操作符的'魔術方法'的約定。

相關問題