首頁  >  文章  >  後端開發  >  Python 函數、未綁定方法和綁定方法有什麼區別?

Python 函數、未綁定方法和綁定方法有什麼區別?

Susan Sarandon
Susan Sarandon原創
2024-10-26 07:03:30273瀏覽

  What's the Difference Between Functions, Unbound Methods, and Bound Methods in Python?

揭示函數、未綁定方法和綁定方法之間的差異

考慮以下程式碼片段:

<code class="python">class A(object):
    def f1(self): pass
a = A()</code>

變數f1 可以以三種不同的形式表現出來:

  • 綁定方法: a.f1 提供與實例a 關聯的方法的存取。
  • Unbound Method: A.f1 對應類 A 所附加的方法。
  • Function: a._____ >由def 關鍵字或lambda 定義的函數,在放置在類別語句中時會經歷轉換。在 Python 2 中,此轉​​換創建了一個未綁定方法,這是 Python 3 中不存在的概念。在類別的實例上存取此方法會進一步將其轉換為綁定方法,該方法將實例無縫綁定為初始參數 (self)。

範例:

這裡,f1 是個函數。相較之下,C.f1 是未綁定方法:

方法呼叫和轉換

<code class="python">def f1(self):
    pass</code>

可以透過在實例上存取未綁定方法將其轉換為綁定方法其類別類型:

<code class="python">class C(object):
    f1 = f1</code>

或使用描述符協定:

函數可以手動轉換為未綁定方法:

<code class="python">C().f1</code>
結合這些技術允許直接創建綁定方法:

<code class="python">C.f1.__get__(C(), C)</code>
函數和未綁定方法之間的關鍵區別在於後者對其類別綁定的感知。因此,呼叫或綁定未綁定方法需要其附屬類別類型的實例。

在 Python 3 中,消除了函數和未綁定方法之間的差異。相反,存取類別實例上的函數直接傳回函數本身:
<code class="python">import types
types.MethodType(f1, None, C)</code>

<code class="python">types.MethodType(f1, None, C).__get__(C(), C)</code>
方法等效性

總之,以下呼叫在Python 2 中是等效的和Python 3:

<code class="python">C.f1 is f1</code>

將函數綁定到實例可以有效地將其初始參數固定到實例,使綁定方法類似於以下lambda 表達式:

以上是Python 函數、未綁定方法和綁定方法有什麼區別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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