下面是 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.
黄舟2017-04-17 17:55:52
実はこの部分は自分で実験してみると分かります。
原文から始めて 2 つの段落に分けて説明します。最初の段落には次のように書かれています。
インスタンス メソッド オブジェクトが呼び出されるとき、基になる関数 (__func__) が呼び出され、引数リストの前にクラス インスタンス (__self__) が挿入されます。たとえば、C が次の定義を含むクラスの場合です。関数 f()、x が C のインスタンスである場合、x.f(1) の呼び出しは C.f(x, 1) の呼び出しと同等です。
元の記事の最初の段落では、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 番目の段落を読んでください:に存在する2 番目の段落の主な考え方は、インスタンス メソッド オブジェクトがクラス メソッド オブジェクトから派生した場合、
クラス インスタンス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でのインスタンスメソッドオブジェクトの作成方法の違い