पायथन 2.x के पास तुलना ऑपरेटरों को ओवरलोड करने के दो तरीके हैं, __cmp__
या "समृद्ध तुलना ऑपरेटर" जैसे __lt__
। समृद्ध तुलना अधिभार को प्राथमिकता दी जाती है, लेकिन ऐसा क्यों है?
अमीर तुलना ऑपरेटर प्रत्येक को लागू करने के लिए सरल हैं, लेकिन आपको उनमें से कई को लगभग समान तर्क के साथ लागू करना होगा। हालांकि, यदि आप बिलिन cmp
और टपल ऑर्डर का उपयोग कर सकते हैं , तो __cmp__
काफी सरल हो जाता है और सभी तुलनाओं को पूरा करता है:
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))
यह सादगी समृद्ध तुलनाओं के सभी 6 (!) को ओवरलोड करने की तुलना में मेरी जरूरतों को पूरा करती प्रतीत होती है। (हालांकि, आप इसे "सिर्फ" 4 तक ले जा सकते हैं यदि आप "स्वैप किए गए तर्क" / परिलक्षित व्यवहार पर भरोसा करते हैं, लेकिन इसका परिणाम मेरी विनम्र राय में जटिलता की शुद्ध वृद्धि है।)
क्या कोई अप्रत्याशित नुकसान है जिससे मुझे अवगत कराने की आवश्यकता है यदि मैं केवल ओवरलोड करता हूं __cmp__
?
मैं समझता हूँ <
, <=
,==
, आदि ऑपरेटरों अन्य प्रयोजनों के लिए अतिभारित किया जा सकता है और उसे किसी भी वस्तु वे लौट सकते हैं। मैं उस दृष्टिकोण के गुणों के बारे में नहीं पूछ रहा हूं, लेकिन केवल इन अंतरों की तुलना करने के लिए इन संचालकों का उपयोग उसी अर्थ में करता हूं जब वे संख्याओं के लिए मायने रखते हैं।
अपडेट: जैसा कि क्रिस्टोफर ने बताया , cmp
3.x में गायब हो रहा है। क्या ऐसे कोई विकल्प हैं जो उपर्युक्त की तुलना में कार्यान्वयन को आसान बनाते हैं __cmp__
?