問題タブ [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 - インスタンスメソッドとして呼び出し可能?
CallableWrappingMeta
新しいクラスの本体を歩き、そのメソッドをクラスでラップするメタクラスがあるとしましょうInstanceMethodWrapper
:
ダミーのラッパーは、引数が入ってくるとそれを出力するだけです。しかし、何か目立つことに気付くでしょう: メソッドはインスタンス オブジェクト レシーバーに渡されInstanceMethodWrapper
ません。クラスの作成中 (メタクラスが処理された後) にインスタンス メソッドに変換されます。
考えられる解決策は、クラスの代わりにデコレータを使用してメソッドをラップすることです。その関数はインスタンス メソッドになります。しかし、実際にInstanceMethodWrapper
は はもっと複雑です。API を提供し、メソッド呼び出しイベントを発行します。クラスはより便利です (そしてパフォーマンスは向上しますが、これはそれほど重要ではありません)。
私もいくつかのデッドエンドを試しました。サブクラスtypes.MethodType
化して、types.UnboundMethodType
どこにも行きませんでした。少し内省すると、彼らはtype
. そのため、両方をメタクラスとして使用してみましたが、どちらもうまくいきませんでした。メタクラスとして特別な要求があるのかもしれませんが、現時点では文書化されていない領域にいるようです。
何か案は?
python - Python データ記述子と非データ記述子
Pythonのドキュメントによると、
__set__()
およびdefinedを持つデータ記述子__get__()
は、インスタンス ディクショナリの再定義を常にオーバーライドします。
私はこの文を理解するのに問題はありませんが、なぜそのような規則が設けられているのかを説明してもらえますか? 結局のところ、インスタンス ディクショナリ内の属性をオーバーライドしたい場合は、(通常) インスタンス ディクショナリ内の属性をオーバーライドしないディスクリプタのメソッドを呼び出すため、既に明示的に( inst.__dict__["attr"] = val
)行う必要があります。inst.attr = val
__set__
編集:明確にするために、何が起こっているのか理解しています。私の質問は、なぜそのようなルールが導入されたのかについてです。
python - self 引数は魔法のようにインスタンス メソッドにどのように渡されるのでしょうか?
私はコード アカデミー ストリームを行っており、Ruby の経験が少しあります。関数にパラメーターcheck_angles(self)
が必要な理由がわかりません。self
私が混乱している理由は、呼び出されたときに self パラメータを関数に渡す理由がわからないからです。関数呼び出し (コード ブロックの最後の行) は暗黙的に self を渡しているようですが、関数は self をパラメータとして明示的に定義する必要があります。
どうしてこれなの?
python - 記述子クラスの __get__ で「if instance is None」が必要なのはなぜですか?
次の例は、有効な Python 項目 31 から得られます。
if instance is None: return self
入れる理由が思いつきません__get__
。Exam
(または を使用する他の潜在的なクラスGrade
) インスタンスはどのようになりNone
ますか?