首頁  >  文章  >  後端開發  >  為什麼 Python 中的 is 無法比較方法,但可以用於函數?

為什麼 Python 中的 is 無法比較方法,但可以用於函數?

Barbara Streisand
Barbara Streisand原創
2024-11-02 18:35:03499瀏覽

  Why Does `is` Fail to Compare Methods in Python, But Works for Functions?

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn