2016-05-23 12 views
11

जब मैं जादू विधि __eq__ को ओवरराइड करने का प्रयास करता हूं, और में प्राप्त मूल विधि तक पहुंचने के लिए super का उपयोग करता हूं, तो मुझे एक त्रुटि मिलती है। वहाँ कोई रास्ता नहीं है यह एक बग है, लेकिन यह यकीन है कि एक तरह लगता है:'सुपर' ऑब्जेक्ट में कोई विशेषता नहीं है '__eq__'

class A(object): 
    def __eq__(self, other): 
     return super(A, self).__eq__(other) 
A() == 0 

# raises AttributeError: 'super' object has no attribute '__eq__' 

इस unintuitive है क्योंकि object.__eq__ मौजूद है, लेकिन class A(object): pass के लिए यह नहीं है। अगर मुझे __eq__ रीसेट्स is चेक पर गलत नहीं हैं, तो यह यहां कामकाज हो सकता है, लेकिन का उपयोग super के बजाय मिश्रित अनुकूल नहीं है। उस मार्ग पर जाना मेरे मामले में ठीक है, लेकिन दूसरों में यह शायद नहीं हो सकता है।

कोई सुझाव या जानकारी __eq__ पर काम क्यों करती है इस तरह से काम करेगा।

+1

त्रुटि 2.7 में उठाई गई है लेकिन 3.5 –

+1

में नहीं उठाई गई है, 'ऑब्जेक्ट' ** उदाहरण ** पर '__eq__' का समर्थन नहीं करता है ... 'ऑब्जेक्ट() .__ eq__' आज़माएं, यह' एट्रिब्यूट एरर 'उठाएगा '... इसके बजाय 'ऑब्जेक्ट .__ eq__ (संभवतः) टाइप करने के लिए क्लासमेड है (जैसे' ऑब्जेक्ट .__ eq __ (ऑब्जेक्ट) ') – donkopotamus

+0

@donkopotamus: यह आपकी ऑब्जेक्ट की तुलना अन्य' 'के साथ नहीं करेगा; यह 'नव' के साथ एक नव निर्मित "रिक्त" ऑब्जेक्ट की तुलना करेगा। – BrenBarn

उत्तर

4

विल के जवाब में बताया गया है, object() वास्तव में उदाहरणों (अजगर 2.7 में) के लिए बिल्कुल __eq__ को लागू नहीं करता है।

आप तथ्य यह है कि object.__eq__ विश्वास यह एक तरीका है की जाँच करता है कि अगर उदाहरणों वस्तु की

इसके बजाय बराबर हैं होना चाहिए में मौजूद है द्वारा धोखा दिया जा रहा है, object.__eq__ वास्तव में एक वर्ग विधि, type से विरासत में मिली है, वह यह है कि यह जांचने के लिए प्रयोग किया जाता है कि प्रकार बराबर हैं या नहीं।

object == int और object == object जैसे अभिव्यक्तियों को संभालने के लिए है।

2

ऐसा इसलिए है क्योंकि object() वास्तव में __eq__() लागू नहीं करता है। "डिफ़ॉल्ट" यहाँ होगा:

class A(object): 
    def __eq__(self, other): 
     if self is other: 
      return True 

     return self == other 

लेकिन, आप प्रयास कर रहे हैं क्या काम किया था, आप वास्तव में जाँच की जाएगी, तो माता-पिता वर्ग के self उदाहरण की बराबरी की है कि क्या other। और, यह वही वस्तु है (self), तो यह होगा। तो अपने कोड के निकटतम बराबर वास्तव में होगा:

class A(object): 
    def __eq__(self, other): 
     if self is other: 
      return True 

     return super(A, self) == other 
+2

जैसा कि मैंने पहले से हटाए गए उत्तर पर टिप्पणी की थी, आपका दूसरा उदाहरण डिफ़ॉल्ट व्यवहार का उत्तराधिकारी नहीं है, क्योंकि यदि आप 'x = ए()' करते हैं, तो 'x == x' गलत लौटाता है। (आपका पहला उदाहरण अनंत रिकर्सन का कारण बनता है।) – BrenBarn

+0

धन्यवाद, यह मेरे संपादन में तय किया जाना चाहिए। – Will

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