首頁  >  文章  >  後端開發  >  為什麼 Python 方法不相等,即使它們引用相同的底層函數?

為什麼 Python 方法不相等,即使它們引用相同的底層函數?

Barbara Streisand
Barbara Streisand原創
2024-10-29 04:59:29858瀏覽

 Why are Python Methods Not Equal, Even if They Refer to the Same Underlying Function?

Python 中的方法引用相等性

在 Python 中,方法是在存取時動態建立的唯一物件。此行為與常規函數不同,常規函數無論何時調用,都會被同一物件引用。

要理解這一點,請考慮以下範例:

class What:
    def meth(self):
        pass
What().meth is What().meth  # False

在此程式碼中,儘管引用相同的底層函數,但 meth 方法並不相等。這是因為每個 meth 物件都是在運行時創建的唯一實例。

這種行為的原因在於Python 的屬性查找過程,其中透過呼叫描述符的(function) .__get__ 方法來產生方法物件:

What.__dict__['meth'].__get__(What(), What)

方法物件的動態建立導致以下觀察結果:

  • 同一類別的實例有不同的方法物件:

    inst = What()
    inst.meth is inst.meth  # False
  • What.meth is Other.meth  # False

What.meth.__func__ == What.meth.__func__  # True
What().meth.__func__ == What().meth.__func__  # True (for same instance)
What().meth.__func__ == What(other_instance).meth.__func__  # False (for different instances)
不同類別中的方法總是不同的物件:在Python 3.8 之前,測試使用== 的方法相等可能會產生不一致的結果。但是,Python 3.8 及更高版本允許基於 .___self__ 和 .___func__ 屬性對方法進行相等比較(如果它們匹配相同)。 作為最佳實踐,要確定兩個方法是否表示相同的基礎函數,請比較他們的 .__func__ 屬性:

以上是為什麼 Python 方法不相等,即使它們引用相同的底層函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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