ホームページ  >  記事  >  バックエンド開発  >  Python のメソッド解決システムでは、関数、非バインド メソッド、およびバインド メソッドはどのように異なりますか?

Python のメソッド解決システムでは、関数、非バインド メソッド、およびバインド メソッドはどのように異なりますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-27 00:49:02951ブラウズ

How do Functions, Unbound Methods, and Bound Methods Differ in Python's Method Resolution System?

関数、非バインド メソッド、およびバインド メソッドの性質を明らかにする

クラスとメソッドの概念は、オブジェクト指向プログラミング パラダイムの基礎です。関数、非バインド メソッド、バインド メソッドの間のニュアンスと関係を理解することは、Python のメソッド解決システムの複雑さを習得するために非常に重要です。

エンティティの定義

  • 関数: def ステートメントを使用して作成された関数は、クラスと直接関連付けられていないスタンドアロンのコード単位です。
  • 非バインド メソッド: 関数がクラスの一部になる場合定義に従うと、バインドされていないメソッドに変換されます。この移行は Python 2 では自動的に行われますが、Python 3 では廃止されます。
  • バインドされたメソッド: クラス インスタンスのメソッドにアクセスすることによって作成され、バインドされたメソッドは最初のパラメータとしてインスタンスを暗黙的に受け取ります ( self).

変換とアクセシビリティ

  • バインドされていないメソッドへの関数: types.MethodType を使用するか、内部の関数にアクセスするクラス本体は、それを非バインド メソッドに効果的に変換します。
  • 非バインド メソッドからバインド メソッドへ: クラス インスタンスの非バインド メソッドにアクセスすると、バインド メソッドが作成されます。
  • 関数からバインドされたメソッドへ: 前の手順と同様に、クラス インスタンスの関数にアクセスすると、バインドされたメソッドが直接生成されます。

主な違い

  • クラス認識: 非バインド メソッドは、それが属するクラスの情報を保持しますが、関数とバインド メソッドにはこの認識がありません。
  • インスタンス化されたアクセス: インスタンスの実行が必要な非バインド メソッドとは異なり、関数とバインド メソッドは直接呼び出すことができます。

同等性と使用法

どちらの Python でも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)
functools.partial(f1, C())</code>

From Unbound to Bound

クラスの Python 2 インスタンスには、対応する直接属性がありません。代わりに、クラス自体の __dict__ 属性を通じて取得できる非バインド メソッドに変換します。ただし、インスタンス上の非バインド メソッドにアクセスすると、バインド メソッドに自動的に変換されます。

結論

関数、非バインド メソッド、バインド メソッドの違いを理解すると、Python のメソッド解決メカニズムを効果的に利用できるようになります。バインドと変換のメカニズムを理解すると、複雑なオブジェクト指向コーディングを簡単に操作できるようになります。

以上がPython のメソッド解決システムでは、関数、非バインド メソッド、およびバインド メソッドはどのように異なりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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