Python 2.x, karşılaştırma operatörlerini __cmp__
veya "zengin karşılaştırma operatörlerini" aşırı yüklemenin iki yolu vardır __lt__
. Zengin karşılaştırma aşırı yüklemelerinin tercih edildiği söyleniyor, ama bu neden böyle?
Zengin karşılaştırma operatörlerinin her birini uygulamak daha kolaydır, ancak birkaçını neredeyse aynı mantıkla uygulamalısınız. Bununla birlikte, yerleşik cmp
ve tuple sıralamayı kullanabilirseniz, __cmp__
oldukça basitleşir ve tüm karşılaştırmaları yerine getirir:
class A(object):
def __init__(self, name, age, other):
self.name = name
self.age = age
self.other = other
def __cmp__(self, other):
assert isinstance(other, A) # assumption for this example
return cmp((self.name, self.age, self.other),
(other.name, other.age, other.other))
Bu basitlik, ihtiyaçlarımı zengin karşılaştırmaların 6'sını (!) Aşırı yüklemekten çok daha iyi karşılıyor gibi görünüyor. (Bununla birlikte, "değiş tokuş edilen argümana" / yansıyan davranışa güvenirseniz, bunu "sadece" 4'e indirebilirsin, ancak bu mütevazi görüşüme göre net bir karmaşıklık artışı ile sonuçlanır.)
Sadece aşırı yükleme yaparsam farkına varmam gereken öngörülemeyen tuzaklar var __cmp__
mı?
Anlıyorum <
, <=
, ==
vb operatörler başka amaçlar için aşırı yüklenebilir ve benzeri herhangi bir nesneyi onlar dönebilir. Bu yaklaşımın yararlarını sormuyorum, sadece bu operatörleri karşılaştırmalar için kullanırken aynı anlamıyla sayılar için kullandıkları farklılıklar hakkında soruyorum.
Güncelleme: Christopher olarak işaret , cmp
3.x yok oluyor Karşılaştırma yapmayı yukarıdakiler kadar kolaylaştıran alternatifler var __cmp__
mı?