मैं 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__
बिल्टिन को ओवरराइड करने का कोई तरीका है? और यदि आप सीधे नहीं कर सकते - यहां क्या हो रहा है जो गैर-जादू विधियों से अलग है जहां आप कर सकते हैं?
धन्यवाद! इस छोटे तथ्य को कभी नहीं पता था। समझ में आता है। प्रतिक्रिया की गति के लिए +1 भी! Btw - यह बहुत तेजी से था - मैं अभी भी मुझे जवाब स्वीकार करने के लिए अनुमति देने के लिए (कहता है कि मैं अभी तक 2 मिनट इंतजार करना) stackoverflow पर प्रतीक्षा कर रहा हूँ। यह एक तेज़ मूल्यवान उत्तर के लिए कैसा है? यह अभी तक :) – Rocketman
इतना तीव्र है कि यह बहुमूल्य घोषित नहीं किया जा सकता था आह - वहाँ हम चले ... अब स्वीकार किए जाते हैं! – Rocketman
'__cmp __()' कॉल '>' ऑपरेटर के लिए अधिभावी द्वारा [) '__lt __()' और '__gt __ (' 'str' के तरीकों' NotImplemented' वापस जाने के लिए] (http://ideone.com/ मजबूर किया जा सकता है आरसी 5 डी 8 वी) यानी, "यदि आपके उत्तर में कोई अन्य जादू तुलना विधियों को परिभाषित किया गया है" अपरिचित है। स्थिरता के लिए, या तो सभी या तरीकों में से कोई भी परिभाषित किया जाना चाहिए: '__lt __()', '__gt __()', '__le __()', '__ge __()', '__eq __()', '__ne __()', '__hash __()'। – jfs