Python 中的方法相等性:解開引用不等式之謎
在Python 中,方法和函數表現出一個奇怪的區別:而函數表現出引用相等性,方法沒有。這可能會導致意外的錯誤,特別是在依賴 is 運算子來比較方法時。
為什麼引用相等性會避開方法
與作為靜態實體的函數不同,方法物件每次被存取時都會動態建立。這是因為方法充當描述符,在呼叫其 .__get__ 方法時傳回一個新的方法物件。例如,在提供的範例中:
class What: def meth(self): pass
賦值 What.meth 傳回一個函數對象,該物件與稍後呼叫 inst.meth 時建立的綁定方法物件不同。這解釋了為什麼 What.meth 是 What.meth 的計算結果為 False。
Python 3.8 中相等的
在 Python 3.8 及更高版本中,可以使用替代方法:使用 == 進行相等性檢定。如果兩個方法的 .__self__ 和 .__func__ 屬性是相同的對象,則認為它們是相等的,這表示它們包裝相同的函數並綁定到相同的實例。
對於函數__ 和 未綁定方法
無論Python 版本如何,函數和未綁定方法(在Python 2 中)都可以使用is 運算子進行比較,因為它們都表示相同的底層函數參考。
底層函數檢定
如果需要檢查兩個方法是否代表同一個底層函數,可以比較.__func__ 屬性:
if What().meth.__func__ == What().meth.__func__: print("Methods represent the same function")
此方法為方法和函數提供一致且可靠的相等性檢查,無論其綁定狀態或Python 版本為何。
以上是為什麼 Python 中的 is 無法比較方法,但可以用於函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!