python3.x - Python 如何通过类方法创建实例方法?
PHPz
PHPz 2017-04-17 17:53:52
0
2
975

下面是 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.

PHPz
PHPz

学习是最好的投资!

全員に返信(2)
黄舟

実はこの部分は自分で実験してみると分かります。


原文から始めて 2 つの段落に分けて説明します。最初の段落には次のように書かれています。

インスタンス メソッド オブジェクトが呼び出されるとき、基になる関数 (__func__) が呼び出され、引数リストの前にクラス インスタンス (__self__) が挿入されます。たとえば、C が次の定義を含むクラスの場合です。関数 f()、x が C のインスタンスである場合、x.f(1) の呼び出しは C.f(x, 1) の呼び出しと同等です。

元の記事の最初の段落では、instance method object が呼び出されるとき、__func__ の最初のパラメーターが最初に class instance に代入されてから呼び出されると述べ、次に例を示します。 リーリー

次の例を使用して説明します。ここにはクラス

があり、その下に関数 Demo と関数 foo があります。 bar

カテゴリ:Demo リーリー

実際:

  1. Python for

    は、foo によって参照される 一般関数 を生成します。 Demo.foo

  2. を記述すると、Python はすぐに demo.fooバインドされたメソッド オブジェクト を作成します。このメソッド オブジェクトは何にバインドされていますか?インスタンス をバインドするため、demo.foodemo を参照し、Python は demo.foo.__self__demo に記録します。 Demo.foodemo.foo.__func__

  3. したがって、この
  4. が呼び出される (

    ) と、実際に demo.foo が呼び出され、demo.foo(1,2,3) (実際には demo.foo.__func__ 自体) が最初のパラメーターとして使用されます。 demo.foo.__self__demo

  5. 私たちが作成したクラスを使用して示すと、彼の例は次のようになります:
リーリー

コード

を見てください: リーリー

テスト結果

: リーリー

2 番目の段落を読んでください:

インスタンス メソッド オブジェクトがクラス メソッド オブジェクトから派生する場合、self に格納される「クラス インスタンス」は実際にはクラスそのものになるため、x.f(1) または C.f(1) の呼び出しは次と同等になります。 f(C,1) を呼び出します。ここで、f は基礎となる関数です。

2 番目の段落の主な考え方は、インスタンス メソッド オブジェクトがクラス メソッド オブジェクトから派生した場合、
に存在する

クラス インスタンスselfクラス それ自体、そして別の例: リーリー また、次の例を使用して説明します。

  1. Python は、Demo.barクラスメソッドオブジェクトからバインドされたメソッドオブジェクトであるbarのを生成します。元々、Demo.barDemo.fooと同じです。も一般的な Python 関数ですが、デコレーター (@classmethod デコレーター) を介して、元の一般的な関数を観察したい場合は、同時に Demo.bar.__func__ でのみ確認できます。 Demo クラスにバインドされているため、Demo.bar.__self__Demo クラスを参照します。

  2. したがって、Demo.bar が呼び出されるとき (Demo.bar(1))、彼は実際に Demo.bar.__func__ を呼び出し、Demo.bar.__self__ (実際には Demo 自身) を最初のパラメーターとして使用します。

私たちが作成したクラスを使用して示すと、彼の例は次のようになります:

リーリー

テストコード:

リーリー

テスト結果:

リーリー

結論:

  1. Python3 ではクラス内に 2 種類の関数があり、1 つは一般的な関数オブジェクト、もう 1 つはバインドされたメソッド オブジェクトです

  2. インスタンスメソッドはインスタンスにバインドされた一般関数で構成されるメソッドオブジェクトであり、クラスメソッドはクラスにバインドされた一般関数で構成されるメソッドオブジェクトです

  3. バウンド メソッドが呼び出されると、実際には元の関数 (__func__ に記録) が呼び出されますが、バインドされたオブジェクトが最初のパラメーター (__self__ に記録) として使用されます。


参考文献:

メソッドと関数の違い
Pythonでのインスタンスメソッドオブジェクトの作成方法の違い

いいねを押す +0
大家讲道理

リーリー

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート