2010-01-11 4 views
9

'daki nesneler için kullanma Maddenin id nesnesini, bir programın tek bir örneği için başka bir şekilde değiştirilebilen nesneye sahip olabilmesi için bir karma anahtar (__hash__ aracılığıyla) kullanmak akıllıca mıdır? Nesne niteliklerini kullanmak daha güzel olurdu ama hepsi değişebilir ve değişebilir.Nesne kimliğini Python

Bu durum bana Sets of instances numaralı telefondan bakarken oluştu ve akıllı olup olmadığını merak ediyorum.

cevap

13

Evet, __eq__ (ve muhtemelen __ne__! -) ile tutarlı bir şekilde tanımladığınız sürece. IOW, a==b ile tam olarak aynı olduğu anlamına gelir, a is b! -)

+1

Teşekkürler. İkinci cümlenin oldukça iyi açıklıyor. –

6

Çoğu Python sınıfı için bu varsayılan davranıştır. Şaşırtıcı olmayanlar iyi bir nedenden dolayı şaşmazlar: bunlar değişebilir koleksiyonlar.

Koleksiyonlar için, içeriklerinin eşitliğine bağlı olarak (__eq__() ile tanımlandığı şekilde) eşitlik ilişkisine sahip olmak pratiktir. Bu, ve __hash__()'un eşitlikle tutarlı olması gerekliliği, elbette __hash__() mutable yapacaktır ki bu, bu tür nesneleri içeren koleksiyonlar için korkunç olacaktır.

Bunu yapabilirsiniz, ancak içerik tabanlı eşitlik ilişkisine mal olur.