ここではPEP-343がtype()を使用しているのはなぜですか?メソッド呼び出しにtype()を使用
mgr = (EXPR)
exit = type(mgr).__exit__ # Not calling it yet
value = type(mgr).__enter__(mgr)
私たちは、同様exit = mgr.__exit__
とvalue = mgr.__enter__()
を使用することができませんでしたか?私にとってもっとシンプルだが、私は何かが欠けていると思う。
わかりました。誰かが__dict__インスタンスを変更しても元の関数を呼び出すようにするのは単なる規約です。それについて考えることさえしなかった - 私がそれをしたいと思う状況をまだ見つけていない;)しかし、もし誰かがしたら、それはいくつかの奇妙な行動につながるだろう。 – Voo
@Voo:大会の論理的根拠は、奇妙な振る舞いを避けているわけではありません。インスタンスaのインスタンスの '__add __()'メソッドは、その型をオンザフライ型でオーバーライドすることによって上書きすることができます。 __class__ = type( ""、(type(a)、)、{"__add__":ラムダセルフ、other:42}) '。その代わりに、この動作の論理的根拠はパフォーマンスです。特別なメソッドは、型の '__dict__'で参照されません。内部型のデータ構造は、特別なメソッドへのポインタのための特別なフィールドを提供するので、もっと早く参照することができます。http://docs.python.org/extending/newtypes.html#the-basicsを参照してください。 –
PyMethodDef配列を意味しますか?まだ検索する必要がありますが(速くなる可能性があります)?または、これはちょうど、すべての特別なメソッドに対して一般的なメソッドを使用するように行われます。なぜなら、tp_iternextのようなメソッドはPyTypeObjectで宣言されているからです。 – Voo