5

के साथ इंट-व्युत्पन्न कक्षा से मूल int तुलना तक पहुंचने के लिए मेरे पास अधिभारित तुलना ऑपरेटर के साथ एक अंतर्निहित कक्षा है।ओवरलोडेड तुलना ऑपरेटर

ओवरलोड किए गए तरीकों के शरीर में मुझे मूल ऑपरेटर का उपयोग करने की आवश्यकता है।

खिलौना उदाहरण:

>>> class Derived(int): 
...  def __eq__(self, other): 
...   return super(Derived, self).__eq__(other) 

अजगर 3.3+ वाले ठीक काम करता है, लेकिन अपवाद AttributeError: 'super' object has no attribute '__eq__' साथ अजगर 2.7 के साथ विफल रहता है।

मैं कई walkarrounds, मैं बहुत साफ नहीं मिला जिसके बारे में सोच सकते हैं:

return int(self) == other 

बस इसे तुलना करने के लिए एक नया int वस्तु के निर्माण की आवश्यकता है, जबकि

try: 
    return super(Derived, self).__eq__(other) 
except AttributeError: 
    return super(Derived, self).__cmp__(other) == 0 

नियंत्रण आधारित प्रवाह विभाजन पायथन संस्करण पर, जो मुझे बहुत गन्दा लगता है (इसलिए पायथन संस्करण का स्पष्ट रूप से निरीक्षण कर रहा है)।

मैं पाइथन 2.7 और 3.3+ के साथ काम करने के एक सुरुचिपूर्ण तरीके से मूल पूर्णांक तुलना कैसे प्राप्त कर सकता हूं?

+1

आप उपयोग कर सकते हैं 'के माध्यम से' सुपर .__ eq__' विधि की तुलना int'। हालांकि, पाइथन संस्करण के आधार पर अंतर्निहित प्रकारों की तुलना में विधियों को बहुत अलग किया जाता है। इसलिए python2 'super.eq' को 1 तर्क (अन्य) की आवश्यकता होती है जबकि पायथन 3 की आवश्यकता होती है (स्वयं और अन्य) – infotoni91

+0

क्या आप 'int (self) == int (अन्य)' बहुत गन्दा मानते हैं? – Phillip

+0

@ फिलिप यह 'int (self) == अन्य' – abukaj

उत्तर

0

मेरा मानना ​​है कि आपको कक्षा को परिभाषित करने से पहले int में __eq__ को परिभाषित करना चाहिए। उदाहरण के लिए:

int = 5 
def int.__eq__(self, other): 
    return self.real == other 
IntDerived = Derived(int) 

यह super वर्ग एक __eq__ विशेषता देना चाहिए।



मुख्य विचार काम किया संपादित, लेकिन यह मेरे ध्यान में लाया गया है कि कोड काम नहीं कर रहा। तो: hasattr एक नया int वस्तु बनाने, एक अपवाद को पकड़ने या स्पष्ट रूप से अजगर संस्करण के लिए जाँच से बचा जाता है का उपयोग कर

class Derived(int): 
    def __eq__(self, other): 
     return self.real == other 

Int = 5 
D = Derived(Int) 
D.__eq__(4) #Output: False 
D.__eq__(5) #Output: True 
+1

है जो कि अजगर नहीं है। – Goyo

+0

@ ग्रीनहॉक 1220 यदि आप 'व्युत्पन्न' वर्ग परिभाषा में '__eq __() 'विधि डालते हैं और इसे पायथन में काम करते हैं तो मैं जवाब स्वीकार करूंगा। 'real 'विशेषता का उपयोग करने का विचार काम करता है, लेकिन कोड पायथन नहीं है। – abukaj

+0

अद्यतन कोड ने मेरे लिए काम किया है। – GreenHawk1220

2

पायथन 2 और 3 एक दूसरे से काफी अलग हैं इसलिए मुझे लगता है कि आपको बुलेट काटने और संस्करणों की जांच करनी चाहिए। यह केवल उम्मीद की जा सकती है कि यदि आप कोड लिखने की कोशिश कर रहे हैं जो दोनों पर काम करता है (जल्द ही या बाद में मेरे अनुभव में आपको कुछ ऐसा लगता है जिसे आपको पैच करना है)। किसी भी प्रदर्शन प्रभाव से बचने के लिए आप कुछ ऐसा कर सकते हैं:

from six import PY2 

class Derived(int): 
    if PY2: 
     def __eq__(self, other): 
      return super(Derived, self).__cmp__(other) == 0 
    else: 
     def __eq__(self, other): 
      return super(Derived, self).__eq__(other) 

यही वह है जो मैं करता हूं। अगर मैं वास्तव में int ...

उपवर्ग के लिए क्या तुम सच में नहीं करना चाहते हैं, तो चाहता था शायद आप की कोशिश कर सकते:

class Derived(int): 
    def __eq__(self, other): 
     return (self^other) == 0 

जाहिर है अगर आप प्रदर्शन के बारे में परवाह आप के साथ कुछ प्रोफाइलिंग करना होगा आपका शेष कोड और पता लगाएं कि उनमें से कोई भी काफी खराब है ...

+0

मुझे बाद का दृष्टिकोण पसंद है, हालांकि यह काम नहीं करता है जब 'अन्य' एक फ्लोट – abukaj

0

: कोड में सुधार हुआ।

नीचे दिया गया कोड पायथन 2.7 और 3 दोनों पर काम करता है।3+:

class Derived(int): 
    def __eq__(self, other): 
     return super(Derived, self).__cmp__(other) == 0 if hasattr(Derived, "__cmp__") else super(Derived, self).__eq__(other) 
1

दोनों संस्करणों एक __xor__ तरीका लागू, तो आप इस कोशिश कर सकते:

class Derived(int): 
    def __eq__(self, other): 
     return not super(Derived, self).__xor__(other) 
+0

मुझे जवाब पसंद है। हालांकि, बहुत साफ नहीं है और न ही फ्लोट की तुलना में काम करता है। साथ ही, मुझे लगता है कि 'सुपर' ऑब्जेक्ट बनाने की कोई आवश्यकता नहीं है, 'स्वयं' पर्याप्त है। 'स्वयं^अन्य' भी आसान हो सकता है। – abukaj

संबंधित मुद्दे