ドキュメント、具体的にはhttp://docs.python.org/2/reference/expressions.html#isを見ていると、Python キーワードの実装を定義する dunder/protocol メソッドが見つかりませんis
。どのような方法でそれを決定しますか?私が理解していることから、2つのオブジェクトで呼び出されたときis
の関数の結果を比較するだけです。id
1 に答える
のダンダーメソッドはありませんis
。それをオーバーライドすることはできません。これは意図的なものです。要点is
は、2 つの式が同じ値を参照しているかどうかを示すことです。したがって、定義により、2 つの異なる値に対して false である必要があります。したがって、それをオーバーライドする必要はありません。
ドキュメントにあるように:
xとyが同じオブジェクトである場合にのみ、オブジェクト IDの演算子
is
とテストが true になります。not is
x is y
( Data model docsにもう少しあります。)
また、is
の結果を比較しませんid
。
id
「このオブジェクトの存続期間中に一意で一定であることが保証されている整数」を返すように定義されています。つまり、is
確かに を使用できますid
が、それを使用する実装については知りません。
そうは言っても、CPython では、同じことを効果的に行っています — <a href="http://hg.python.org/cpython/file/3.3/Python/ceval.c#l4430" rel="noreferrer ">is
は、ポインターが等しいことを確認し、ポインターをid
整数にキャストして返します。したがって、直接実装する場合と経由で実装する場合の唯一の違いはid
、追加の関数呼び出しのペアと、マシン コードにコンパイルされないキャストです…</p>
しかし、他の実装では、それも当てはまらない場合があります。(Jython と PyPy がポインターのようなものさえも持たない言語で書かれていることを考えると、これは明らかです。) たとえば、PyPy ではis
、基になる RPython オブジェクトが同じであることを確認し、 while をid
返します。キーはその場で生成されます (後で同じ値を呼び出す場合はキャッシュされid
ます)。