問題タブ [python-descriptors]
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.
python - 記述子を持つクラスのインスタンス属性は、記述子のメソッドでどのように解決されますか?
インスタンスのインスタンス化後に取得されたインスタンス属性、またはインスタンスの構築中に設定されたインスタンス属性が、記述子を介して行われる理由がわかりません。
たとえば、次の記述子とクラスがあるとします。
ディスクリプタ
クラス
次に、Planet のインスタンスを作成し、その質量を取得します。
Positive.__get__
それがクラス属性であることを考えると、なぜ呼び出されるのかわかりません。誰か説明してくれませんか?さらに紛らわしいのはPositive.__set__
、コンストラクタ パラメータの直接割り当てをインターセプトする方法mass_kilograms
です。
ありがとう!
python - クラス デコレータが自己をバインドしない
そのクラスのメソッドとしてデコレータを定義するクラスを定義しました。デコレーター自体は、装飾されたメソッドを置き換える 2 番目のクラスの呼び出し可能なインスタンスを作成します。装飾されたメソッドは実際にはクラスになっているので、メソッドを呼び出すことができます。私の(架空の、最小限の)例では、メソッドごとのコールバックのカスタム最大数でコールバックを登録したいと考えています。
すべてが関数に対して期待どおりに機能しますが、クラス インスタンスが装飾されたメソッドにバインドされていないため、クラス メソッドを装飾すると壊れます。
コールバックを受け入れるメソッドを定義すると、次のようになります。
self を明示的に渡すと機能しますが、インスタンスがバインドされていると仮定するだけでは機能しません。
これはトレースバックです:
私はいつもそれt.foo(i=5)
が記述子を経由するための基本的な構文糖衣Test.foo(t, i=5)
だと思っていますが、それは間違っているようです。だからここに私の質問があります:
- これが期待どおりに機能しない理由は何ですか?
- それを機能させるにはどうすればよいですか?
ありがとうございました!
PS: 私は python 3.8 を使用しています
python - __get__() が呼び出されたときにコードを実行するようにクラスを装飾する
以下のコードを見てください
student1.get_student_id()
orstudent1.get_student_name()
が呼び出されるたびに (またはget () がアクセスされたときに) DB に学生を追加するようなコードを実行したいと思います。間違った記述子を使用した場合は修正してください)。そして、以下のような複数のクラスに対してのみデコレータを介してこれを行う必要があります
デコレータを使用してこれをどのように達成できますか? 任意のメソッドを持つことができる複数のクラスに対して単一のデコレータを使用する必要があります。任意のクラスの任意のメソッド (_ または __ で始まるものを除く) が呼び出されるたびに、デコレーターはデータを DB に保存する必要があります。