揭示函數、未綁定方法和綁定方法之間的差異
考慮以下程式碼片段:
<code class="python">class A(object): def f1(self): pass a = A()</code>
變數f1 可以以三種不同的形式表現出來:
範例:
這裡,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中文網其他相關文章!