ホームページ  >  記事  >  バックエンド開発  >  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 は、次の 3 つの異なる形式で表現できます:

  • バインドされたメソッド: a.f1 は、インスタンス a.
  • に関連付けられたメソッドへのアクセスを提供します。 Unbound Method: A.f1 は、クラス A にアタッチされたメソッドに対応します。
  • Function: a.__dict__['f1'] は、基礎となる関数定義を直接取得します。 .

オブジェクトの区別

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。