問題タブ [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.

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

python - インスタンスメソッドとして呼び出し可能?

CallableWrappingMeta新しいクラスの本体を歩き、そのメソッドをクラスでラップするメタクラスがあるとしましょうInstanceMethodWrapper:

ダミーのラッパーは、引数が入ってくるとそれを出力するだけです。しかし、何か目立つことに気付くでしょう: メソッドはインスタンス オブジェクト レシーバーに渡されInstanceMethodWrapperません。クラスの作成中 (メタクラスが処理された後) にインスタンス メソッドに変換されます。

考えられる解決策は、クラスの代わりにデコレータを使用してメソッドをラップすることです。その関数はインスタンス メソッドになります。しかし、実際にInstanceMethodWrapperは はもっと複雑です。API を提供し、メソッド呼び出しイベントを発行します。クラスはより便利です (そしてパフォーマンスは向上しますが、これはそれほど重要ではありません)。

私もいくつかのデッドエンドを試しました。サブクラスtypes.MethodType化して、types.UnboundMethodTypeどこにも行きませんでした。少し内省すると、彼らはtype. そのため、両方をメタクラスとして使用してみましたが、どちらもうまくいきませんでした。メタクラスとして特別な要求があるのか​​もしれませんが、現時点では文書化されていない領域にいるようです。

何か案は?

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

python - Python データ記述子と非データ記述子

Pythonのドキュメントによると、

__set__()およびdefinedを持つデータ記述子__get__()は、インスタンス ディクショナリの再定義を常にオーバーライドします。

私はこの文を理解するのに問題はありませんが、なぜそのような規則が設けられているのかを説明してもらえますか? 結局のところ、インスタンス ディクショナリ内の属性をオーバーライドしたい場合は、(通常) インスタンス ディクショナリ内の属性をオーバーライドしないディスクリプタのメソッドを呼び出すため、既に明示的に( inst.__dict__["attr"] = val)行う必要があります。inst.attr = val__set__

編集:明確にするために、何が起こっているのか理解しています。私の質問は、なぜそのようなルールが導入されたのかについてです。

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

python - self 引数は魔法のようにインスタンス メソッドにどのように渡されるのでしょうか?

私はコード アカデミー ストリームを行っており、Ruby の経験が少しあります。関数にパラメーターcheck_angles(self)が必要な理由がわかりません。self

私が混乱している理由は、呼び出されたときに self パラメータを関数に渡す理由がわからないからです。関数呼び出し (コード ブロックの最後の行) は暗黙的に self を渡しているようですが、関数は self をパラメータとして明示的に定義する必要があります。

どうしてこれなの?

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

python - 記述子クラスの __get__ で「if instance is None」が必要なのはなぜですか?

次の例は、有効な Python 項目 31 から得られます。

if instance is None: return self入れる理由が思いつきません__get__Exam(または を使用する他の潜在的なクラスGrade) インスタンスはどのようになりNoneますか?