関数、非バインド メソッド、バインド メソッドの違いを明らかにする
次のコード スニペットを考えてみましょう:
<code class="python">class A(object): def f1(self): pass a = A()</code>
変数 f1 は、次の 3 つの異なる形式で表現できます:
オブジェクトの区別
def キーワードまたはラムダで定義された関数は、クラス ステートメント内に配置されると変換を受けます。 Python 2 では、この変換によって非バインド メソッドが作成されますが、これは Python 3 には存在しない概念です。クラスのインスタンスでこのメソッドにアクセスすると、さらにバインド メソッドに変換され、インスタンスが初期パラメータ (self) としてシームレスにバインドされます。
例:
<code class="python">def f1(self): pass</code>
ここで、f1 は関数です。対照的に、C.f1 は非バインド メソッドです。
<code class="python">class C(object): f1 = f1</code>
メソッドの呼び出しと変換
非バインド メソッドは、インスタンス上でアクセスすることでバインド メソッドに変換できます。クラス型の:
<code class="python">C().f1</code>
または記述子プロトコルの使用:
<code class="python">C.f1.__get__(C(), C)</code>
関数は手動で非バインド メソッドに変換できます:
<code class="python">import types types.MethodType(f1, None, C)</code>
これらの手法を組み合わせるバインドされたメソッドを直接作成できます:
<code class="python">types.MethodType(f1, None, C).__get__(C(), C)</code>
関数と非バインド メソッドの決定的な違いは、後者がクラス バインディングを認識しているかどうかにあります。したがって、非バインド メソッドの呼び出しまたはバインドには、その関連クラス型のインスタンスが必要です。
Python 3 では、関数と非バインド メソッドの区別はなくなりました。代わりに、クラス インスタンスの関数に直接アクセスすると、関数自体が返されます。
<code class="python">C.f1 is f1</code>
メソッドの同等性
要約すると、次の呼び出しは両方の Python 2 で同等です。および Python 3:
<code class="python">f1(C()) C.f1(C()) C().f1()</code>
関数をインスタンスにバインドすると、その初期パラメータが効果的にインスタンスに固定され、バインドされたメソッドは次のラムダ式に似たものになります:
<code class="python">lambda *args, **kwargs: f1(C(), *args, **kwargs)</code>
以上がPython の関数、非バインド メソッド、バインド メソッドの違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。