python方法の結合方法と非結合方法を詳細に説明する。


前に書く
Pythonのクラスには属性以外にも方法があります。もちろん文書や注釈などもありますが、これは人が見ているだけで、コンピュータは関心がありません。前にも話しましたが、私たちは一般的に例を使って方法を呼び出します。普通だと言った以上、他の呼び出し方法があると説明します。今日は「バインディング方法と非バインディング方法」について説明します。
バインディング方法と非バインディング方法
Pythonでは特殊な方法以外にも、クラスの他の一般的な方法がよく使われていますので、一般的な方法についても研究してみたいです。

>>> class Sample:
...  def f(self):
...    print('f function is a normal method')
...
>>> sam = Sample()
>>> sam.f
f function is a normal method
私たちの前の学習から、クラスsampleでは、メソッドf()は本質的に関数ですが、この関数の最初のパラメータはselfである必要があります。もちろん、クラスを区別するために別の名前が付けられました。しかし、関数と比べて本質的には違いがありません。
インスタンスを作成した後、この方法を実例で呼び出すと、Python解釈器はインスタンスを最初のパラメータとして暗黙的にこの方法に伝えたので、selfというパラメータは明示的に書く必要がなく、この知識点は何回も繰り返し説明しました。つまり、selfがインスタンスであることを理解してもらうためです。
実例を明示的に伝える方法を望むなら、次のようにすることができる。

>>> Sample.f(sam)
f function is a normal method
上記の方法を用いて、前述の観点、すなわち実際化後、selfとインスタンスsamは同じであることをより良く証明することができる。普通、私達はクラスの中でselfを使って、種類の外でsamを使って、両者はそれぞれ分業があります。
もし私たちがクラスでメソッドを呼び出す時、実例を伝えないとどうなりますか?

>>> Sample.f()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: unbound method f() must be called with Sample instance as first argument (got nothing instead)
答えは間違いを報告するので、詳しく見てみますと、パラメータが足りないので、実例です。だから、実例を伝えます。
Pythonの中のすべては対象ですので、種類Sampleの方法f()も対象です。具体的には関数オブジェクトです。

>>> Sample.f
<function Sample.f at 0x000000000244AB48>
もちろん、インスタンスを通してオブジェクトを得ることもできます。

>>> sam.f
<bound method Sample.f of <__main__.sample instance at 0x000000000244AB48>>
この方法のオブジェクトは上記の例で得られ、ここでは「バインディング方法」であることを示しています。
ここでは、「バインディング方法」と「非バインディング方法」の概念の本質に徐々に近づいていきます。
種類のSampleの属性の中に、___udict_.属性の方法については、前の文章でも紹介しましたが、これからはその種類の内部情報を見てみます。

>>> sample.__dict__['f']
<function f at 0x000000000250D828>
上から見れば、fは関数オブジェクトであるという近くの説明ができます。
次に私達に新しい知識を勉強させてください。「説明器」とは何ですか?Pythonにはいくつかの特殊な方法があります。それぞれ_u u uget_,_set_()同前delete_()ちょっと簡単に言えば、これらの特殊な方法がある対象は「説明器」といいます。
説明器はPythonで広く使われていますが、もしあなたが私の言ったsuperを覚えているならば、それは属性、実例的な方法、継承などsuperを使ったバックグラウンド実装機構です。説明器の内容については、ここで具体的に説明すると、単にバインディング法と非バインディング法の問題を解決するために述べる。ですから、もし興味があれば、自分でGoogleを作ることができます。
私たちはここでちょっと見てみます。ゲット()その説明器に関する契約は以下の通りである。

des.__get__(self,obj,type=None) ---> value
上記に具体的に適用された例は次のようになります。

>>> sample.__dict__['f'].__get__(sam,sample)
<bound method sample.f of <__main__.sample instance at 0x000000000244AB48>>
上に表示されている結果はsam.fと同じです。したがって、クラスを通して方法を取得する場合、非バインディング方法のオブジェクトが得られると考えられます。方法をインスタンスで取得すると、結合方法オブジェクトが得られる。
後に書く
バインディング方法と非バインディング方法はこれで終わります。種類の方法は多くに分けられます。バインディング方法と非バインディング方法以外にも静的方法と種類の方法などがあります。これから順次紹介しますので、ご期待ください。
書いたものは私のものです。見たものはあなたのものです。自分の時間を無駄にしないでください。学んで得られるものがあります。文章があなたのために役に立つと思ったら、歓迎します。
The end
以上はpython方法のバインディング方法と非バインディング方法の詳細についてです。pythonバインディング方法と非バインディング方法に関する詳細については他の関連記事に注目してください。