下面是 Python 3.x language reference 中的一段话,大意是理解的,不过写不出一个这样的示例,求大神给个与这段话一致的示例:
When an instance method object is derived from a class method object, the “class instance” stored in self will actually be the class itself, so that calling either x.f(1) or C.f(1) is equivalent to calling f(C,1) where f is the underlying function.
実はこの部分は自分で実験してみると分かります。
原文から始めて 2 つの段落に分けて説明します。最初の段落には次のように書かれています。
元の記事の最初の段落では、
次の例を使用して説明します。ここにはクラスinstance method object
が呼び出されるとき、__func__
の最初のパラメーターが最初にclass instance
に代入されてから呼び出されると述べ、次に例を示します。 リーリーがあり、その下に関数
Demo
と関数foo
があります。bar
カテゴリ:
実際:Demo
リーリーは、
foo
によって参照される 一般関数 を生成します。Demo.foo
を記述すると、Python はすぐに
demo.foo
バインドされたメソッド オブジェクト を作成します。このメソッド オブジェクトは何にバインドされていますか?インスタンス をバインドするため、demo.foo
はdemo
を参照し、Python はdemo.foo.__self__
をdemo
に記録します。Demo.foo
demo.foo.__func__
) と、実際に
demo.foo
が呼び出され、demo.foo(1,2,3)
(実際にはdemo.foo.__func__
自体) が最初のパラメーターとして使用されます。demo.foo.__self__
demo
を見てください: リーリー
テスト結果: リーリー
2 番目の段落を読んでください:インスタンス メソッド オブジェクトがクラス メソッド オブジェクトから派生する場合、self に格納される「クラス インスタンス」は実際にはクラスそのものになるため、x.f(1) または C.f(1) の呼び出しは次と同等になります。 f(C,1) を呼び出します。ここで、f は基礎となる関数です。 に存在する
クラス インスタンス
self
が クラス それ自体、そして別の例: リーリー また、次の例を使用して説明します。Python は、
Demo.bar
クラスメソッドオブジェクトからバインドされたメソッドオブジェクトであるbarのを生成します。元々、Demo.bar
はDemo.foo
と同じです。も一般的な Python 関数ですが、デコレーター (@classmethod
デコレーター) を介して、元の一般的な関数を観察したい場合は、同時にDemo.bar.__func__
でのみ確認できます。Demo
クラスにバインドされているため、Demo.bar.__self__
はDemo
クラスを参照します。したがって、
Demo.bar
が呼び出されるとき (Demo.bar(1)
)、彼は実際にDemo.bar.__func__
を呼び出し、Demo.bar.__self__
(実際にはDemo
自身) を最初のパラメーターとして使用します。私たちが作成したクラスを使用して示すと、彼の例は次のようになります:
リーリーテストコード:
リーリーテスト結果:
リーリー結論:
Python3 ではクラス内に 2 種類の関数があり、1 つは一般的な関数オブジェクト、もう 1 つはバインドされたメソッド オブジェクトです
インスタンスメソッドはインスタンスにバインドされた一般関数で構成されるメソッドオブジェクトであり、クラスメソッドはクラスにバインドされた一般関数で構成されるメソッドオブジェクトです
バウンド メソッドが呼び出されると、実際には元の関数 (
__func__
に記録) が呼び出されますが、バインドされたオブジェクトが最初のパラメーター (__self__
に記録) として使用されます。参考文献:
メソッドと関数の違い
Pythonでのインスタンスメソッドオブジェクトの作成方法の違い
リーリー