「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Python のメソッド解決システムでは、関数、非バインド メソッド、およびバインド メソッドはどのように異なりますか?

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

2024 年 11 月 10 日に公開
ブラウズ:860

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

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

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

エンティティの定義

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

変換とアクセシビリティ

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

主な違い

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

等価性と使用法

Python 2 と Python 3 の両方で、次の式は次のとおりです。機能的に同等です:

f1(C())
C.f1(C())
C().f1()

関数をインスタンスにバインドすると、最初のパラメーターが本質的に指定されたインスタンスに設定される変更バージョンが作成されます。基本的に、このバインドされたメソッドは次の代替形式と同じように動作します:

lambda *args, **kwargs: f1(C(), *args, **kwargs)
functools.partial(f1, C())

Unbound から Bound へ

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

結論

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

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3