2013-02-27 25 views
5

मैं str का विस्तार करने की कोशिश कर रहा हूं और जादू विधि __cmp__ ओवरराइड कर रहा हूं। नीचे दिए गए उदाहरण से पता चलता है कि जब > प्रयोग किया जाता है जादू विधि __cmp__ कहा जाता है कभी नहीं किया गया है:क्या आप पाइथन में बिल्टिन को विस्तारित करते समय जादू विधि को ओवरराइड कर सकते हैं?

class MyStr(str): 
    def __cmp__(self, other): 
     print '(was called)', 
     return int(self).__cmp__(int(other)) 


print 'Testing that MyStr(16) > MyStr(7)' 
print '---------------------------------' 
print 'using _cmp__ :', MyStr(16).__cmp__(MyStr(7)) 
print 'using > :', MyStr(16) > MyStr(7) 

चलाने में परिणाम जब:

Testing that MyStr(16) > MyStr(7) 
--------------------------------- 
using __cmp__ : (was called) 1 
using > : False 

जाहिर है, जब > का उपयोग कर अंतर्निहित भीतर "की तुलना" कार्यक्षमता बिल्टिन बुलाया जा रहा है, जो इस मामले में एक वर्णमाला आदेश है।

क्या जादू विधियों के साथ __cmp__ बिल्टिन को ओवरराइड करने का कोई तरीका है? और यदि आप सीधे नहीं कर सकते - यहां क्या हो रहा है जो गैर-जादू विधियों से अलग है जहां आप कर सकते हैं?

उत्तर

4

तुलना ऑपरेटरों do not call __cmp__ अगर the corresponding magic method या इसके समकक्ष परिभाषित कर रहे हैं और NotImplemented नहीं लौटते:

class MyStr(str): 
    def __gt__(self, other): 
     print '(was called)', 
     return int(self) > int(other) 


print MyStr(16) > MyStr(7) # True 

 

पुनश्च:

class MyStr(str): 
    def __gt__(self, other): 
     try: 
      return int(self) > int(other) 
     except ValueError: 
      return False 
: आप शायद हानिरहित तुलना अपवाद फेंक नहीं करना चाहते
+0

धन्यवाद! इस छोटे तथ्य को कभी नहीं पता था। समझ में आता है। प्रतिक्रिया की गति के लिए +1 भी! Btw - यह बहुत तेजी से था - मैं अभी भी मुझे जवाब स्वीकार करने के लिए अनुमति देने के लिए (कहता है कि मैं अभी तक 2 मिनट इंतजार करना) stackoverflow पर प्रतीक्षा कर रहा हूँ। यह एक तेज़ मूल्यवान उत्तर के लिए कैसा है? यह अभी तक :) – Rocketman

+0

इतना तीव्र है कि यह बहुमूल्य घोषित नहीं किया जा सकता था आह - वहाँ हम चले ... अब स्वीकार किए जाते हैं! – Rocketman

+2

'__cmp __()' कॉल '>' ऑपरेटर के लिए अधिभावी द्वारा [) '__lt __()' और '__gt __ (' 'str' के तरीकों' NotImplemented' वापस जाने के लिए] (http://ideone.com/ मजबूर किया जा सकता है आरसी 5 डी 8 वी) यानी, "यदि आपके उत्तर में कोई अन्य जादू तुलना विधियों को परिभाषित किया गया है" अपरिचित है। स्थिरता के लिए, या तो सभी या तरीकों में से कोई भी परिभाषित किया जाना चाहिए: '__lt __()', '__gt __()', '__le __()', '__ge __()', '__eq __()', '__ne __()', '__hash __()'। – jfs

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

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