問題タブ [descriptor]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
3340 参照

python - python3:.__ get __()を使用してメソッドをクラスインスタンスにバインドします。これは機能しますが、なぜですか?

クラスインスタンスにメソッドを追加する場合、次のような単純な割り当てを行うことはできません。

これは確かにprint_var通常の関数のように動作するため、self引数は彼の典型的な意味を持ちません。

関数をメソッドと見なす(つまり、インスタンスにバインドする)ために、私は次のコードを使用していました。

.__get__しかし、私はそれがこの目的にも使用できることを発見しました:

ここでの問題は、それが正しく機能することですが、その方法と理由がわかりません。に関するドキュメント.__get__はあまり役に立たないようです。

誰かがPythonのインタプリタのこの振る舞いを明らかにしてくれれば幸いです。

0 投票する
3 に答える
9435 参照

java - 「記述子」と「署名」の違いは何ですか?

現在、ASM (Java バイトコード計測ライブラリ) を使用しています。特定のメソッドの署名を取得するために、「desc」という名前のフィールドがあります。これは「記述子」の略だと思いますが、なぜ「署名」と名付けられていないのでしょうか。「記述子」と「署名」に違いはありますか?

0 投票する
1 に答える
3625 参照

java - Javaメソッド記述子のドル記号の意味?

たとえば、Jikes RVM スタックの一部です。

'access' はメソッド名である必要があります。しかし、クラスのソース コードとそのインターフェイスを確認したところ、「アクセス」と呼ばれるメソッドはありませんでした。Google はあらゆる種類の句読点を嫌うため、Google で答えを見つけることができませんでした。誰でもここで助けることができますか?どうもありがとう。

0 投票する
1 に答える
1637 参照

python - Pythonクラスデータ記述子リスト

クラスのデータ記述子のリストを取得する方法がわからないようです。基本的に、フィールドと未設定のフィールドに対していくつかの検証を実行したいと思います。例えば:

それから私はそれを次のようなモデルに実装したかった:

定義したフィールドのリストを取得するにはどうすればよいですか?私は考えていました、私は次のことができました:

しかし、私は継承の問題に遭遇しました、何かアイデアはありますか?

0 投票する
4 に答える
4633 参照

python - クラスのメソッドをプログラムで生成する

元のメソッドと残りの引数を取るラッパー メソッドにリダイレクトする約 20 のメソッドがあります。

これらのメソッドをプログラムでさらに追加するにはどうすればよいですか? これは、すべてが間違っているように見える前に私が得た限りです。

クラス定義内で割り当てるか、より自然に感じる何か他のものでこれを行うことはできますか?

__get__からの魔法の機能よりも、可能な場合は友人を使用したいと思いtypesます。

0 投票する
2 に答える
165 参照

python - 記述子を考慮してアクセスを高速化するために関数をローカル名前空間に配置する

クラスの厳しいループでnumpy.random.normal関数を使用します。

Python で複数のルックアップを使用するのはかなり遅いことを私は知っています。にnumpy.random.normalは 3 つのルックアップがあります。最初にnumpyがルックアップされ、次に がルックアップされrandom、次に がルックアップされますnormal

numpy.random.normalそこで、ローカル変数に割り当てることでこの問題に対処することにしました_normal

どうぞ:

私が本当に心配しているのは記述子です。クラス内の変数がアクセスされると、すべての基底クラスが検索され、同じ名前のデータ記述子が検索されます。ここで説明されています:

属性名を確認objectname.__class__.__dict__してください。存在し、データ記述子である場合は、記述子の結果を返します。のすべてのベースでobjectname.__class__同じケースを検索します。

したがって、_normal上記のようにローカル空間に入れると、データ記述子のすべての基本クラスが検索されると思います。そして、それが減速の原因になることを警戒しています。

私の懸念は正当なものですか?

基本クラスの記述子を検索するのにかかる時間について心配する必要がありますか?

また、クラスで使用されているときに、モジュールの奥深くにある関数へのアクセスを高速化するより良い方法はありますか?


回答へのコメントで議論がありました。

(私の特定のケースでは) 重要と思われる実装の詳細をいくつか追加することにしました。

実際、コードはこれに近いです (非常に単純化されています)。

0 投票する
2 に答える
2102 参照

python - Python クラスに __setattr__ と記述子の両方を使用する

カスタム属性アクセスを使用__setattr__して提供する python クラスを作成しています。__getattr__

ただし、一部の属性は一般的な方法で処理できないため、それらには記述子を使用したいと考えていました。

__get__記述子の場合、インスタンスを優先して記述子が呼び出され__getattr__ますが、属性に割り当てると__setattr__、記述子を優先して呼び出されるという問題が発生します__set__

例:

プリント:

記述子__set__は呼び出されません。

__setattr__定義は、限られた一連の名前の動作をオーバーライドするだけではないため、延期できる明確な場所はありません。object.__setattr__

属性への代入で記述子を使用する推奨される方法はあり__setattr__ますか?

0 投票する
1 に答える
821 参照

python - 実行時に Python 記述子の __get__ メソッドを変更できますか?

すべて、タイトルが尋ねるように、__get__実行時に記述子のメソッドを変更することは可能ですか。私は、実行時にオンザフライで装飾されたり装飾されていない機能を持っている状況にあります。この関数の結果を属性として利用できるようにしたいと考えて@propertyいます。私はそれを調査し、記述子であることがわかりましたが、記述子の__get__メソッドは読み取り専用のようです。

上記のコードは、大まかに言って、私が望むことを行います

  1. 値はコンストラクターで設定されます
  2. get_xメソッドを思う存分飾れる
  3. instance.x正しい値を返します

私の問題は、get_x基本的に不要なので、メソッドを作成する必要がないことです。__get__x のメソッドは読み取り専用である ため、修飾できませんでした。

バックグラウンド

私はターン ベースの戦略ゲームを書いており、デコレータを使用して永続的な条件を実装しています。テストケースを使用すると、これらのデコレータを効果的に実装できますが、計算された値を取得するには、属性アクセスではなく関数呼び出しを使用する必要があるという問題があります。ユニットを説明する値を取得すると、一貫性のない関数または属性が使用されるため、これは悪い考えのように思えます。可能であれば、属性を標準化したいです。

0 投票する
4 に答える
1979 参照

python - 任意の変数のように動作するが、変更/読み取り時にコールバックを持つクラスを作成する

Python 変数として動作するクラスを作成したいと思いますが、「変数」が変更/読み取りされたときにコールバック関数を呼び出します。

つまり、次のようにクラスを使用できるようにしたいと考えています。

x を myclass のインスタンスとして定義します。コンストラクター ( INIT ) は、パラメーターとして 2 つの関数を受け取ります。x が変更されるたびに呼び出される関数と、x が「読み取られる」たびに呼び出される関数です。

次のステートメント:

1を「保存」し、change_callback(1)何でもできる呼び出しをトリガーします。

次のステートメント:

保存された値を取得し、保存された値を変更して他のことを行う可能性のある呼び出しread_callback()を行います。

たとえば、次のようなものを記述できるようにするために、これを任意のタイプで機能させたいと思います。

x=[1 2 3]トリガーするものchange_callback([1 2 3])

x.append(4)トリガーchange_callback([1 2 3 4])します(およびおそらくread_callback()before への呼び出し)

x={'a':1}トリガーしますchange_callback({'a':1})

print(x)read_callback() への呼び出しをトリガーします...もちろん、最後に保存された値を印刷用に返します。

アイデアは、変数へのアクセスをログに記録したり、他の計算を生成したりできるということです...一見。

これが可能であるべきだと感じていますが、オブジェクトが何から継承する必要があるのか​​ よくわかりません...リストなどの1つのタイプに制限する必要がある場合、すべての代入演算子を再定義する方法はありますかappend()...) のようなメソッドを「一度に」実行して、元の動作 (基本クラスのメソッド) を維持し、コールバックを追加します...

または、同じ目標を達成するためのより適切な方法 (モジュール...) はありますか?

前もって感謝します、

0 投票する
1 に答える
203 参照

python - 記述子のPythonメタプログラミング:クラス定義の後に記述子を追加する方法は?

クラスがすでに定義された後、記述子を関連付けるにはどうすればよいですか?

通常の記述子シナリオでは、これを実行します。

そして、Descriptor.__get__(self,obj,kls)が呼び出されるたびに、2番目のパラメーターはのインスタンスでXあり、すべてが幸せで素晴らしいものです。

しかし、Xすでにそのように定義されている場合はどうなりますか?

事後に記述子を追加するにはどうすればよいですか(そして正しく機能させるには!)?私のすべての試みは、クラスへの適切な関連付けを取得していません

私はこれをやっています。DRYの方法で追加したい属性がたくさんあり、それらをcached_properties(それぞれの値をメモ化するために使用している記述子)にしたいのです。