2011-08-01 19 views
2

ここでは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__()を使用することができませんでしたか?私にとってもっとシンプルだが、私は何かが欠けていると思う。

答えて

5

PEP は、型の属性の代わりにインスタンス自体の属性を使用できますが、これはPythonの特殊メソッドの使用とは対照的です。例えば

a + b 

type(a).__add__(a, b) 

しないに変換され、次の例で示すように

a.__add__(b) 

:だから

>>> class MyInt(int): 
...  pass 
... 
>>> a = MyInt(3) 
>>> b = MyInt(4) 
>>> a + b 
7 
>>> a.__add__ = lambda self, other: 42 
>>> a + b 
7 

、T o残りのPythonと一貫性を持たせるためには、特別なメソッド__enter__()__exit__()も型の辞書で最初に検索する必要があります。

+0

わかりました。誰かが__dict__インスタンスを変更しても元の関数を呼び出すようにするのは単なる規約です。それについて考えることさえしなかった - 私がそれをしたいと思う状況をまだ見つけていない;)しかし、もし誰かがしたら、それはいくつかの奇妙な行動につながるだろう。 – Voo

+1

@Voo:大会の論理的根拠は、奇妙な振る舞いを避けているわけではありません。インスタンスaのインスタンスの '__add __()'メソッドは、その型をオンザフライ型でオーバーライドすることによって上書きすることができます。 __class__ = type( ""、(type(a)、)、{"__add__":ラムダセルフ、other:42}) '。その代わりに、この動作の論理的根拠はパフォーマンスです。特別なメソッドは、型の '__dict__'で参照されません。内部型のデータ構造は、特別なメソッドへのポインタのための特別なフィールドを提供するので、もっと早く参照することができます。http://docs.python.org/extending/newtypes.html#the-basicsを参照してください。 –

+0

PyMethodDef配列を意味しますか?まだ検索する必要がありますが(速くなる可能性があります)?または、これはちょうど、すべての特別なメソッドに対して一般的なメソッドを使用するように行われます。なぜなら、tp_iternextのようなメソッドはPyTypeObjectで宣言されているからです。 – Voo

2

上記コンストラクトはmgrオブジェクトの種類(クラス)の結合していない方法、それ以外mgr辞書がacessedさを取得し、あなたがバインドされたメソッドを取得します。

関連する問題