2009-12-20 26 views
38

संभावित डुप्लिकेट:
Python: defining my own operators?
Rules of thumb for when to use operator overloading in pythonऑपरेटर अजगर में अधिक भार

यह अजगर में ऑपरेटरों को ओवरलोड करना संभव है? यदि हां, तो क्या कोई नया ऑपरेटर परिभाषित कर सकता है, जैसे कि ++ और <<?

+2

डुप्लिकेट प्रश्न: http://stackoverflow.com/questions/932328। Http://stackoverflow.com/questions/1552260 भी देखें। –

+2

यह एक डुप्लिकेट प्रश्न हो सकता है, लेकिन मुझे स्वीकृत उत्तर अन्य प्रश्नों की तुलना में अधिक उपयोगी पाया गया है, क्योंकि यह सभी __ xxx __ विधियों के विवरण से लिंक करता है। – ToolmakerSteve

+0

@ToolmakerSteve - क्षमा करें, मैंने ध्वजांकित किया और इसे उत्तर के रूप में हटा दिया। यह एक लिंक से ज्यादा कुछ नहीं था, जिसका मतलब है कि यह लिंक्रॉट के अधीन था। – ArtOfWarfare

उत्तर

66

जैसा कि अन्य उत्तरों का उल्लेख किया गया है, आप वास्तव में ऑपरेटरों को अधिभारित कर सकते हैं (कक्षा में विशेष विधियों को निर्धारित करके, यानी जिनके नाम दो अंडरस्कोर के साथ शुरू होते हैं और समाप्त होते हैं)। सभी विवरण here हैं।

आपके सवालों के जवाब को पूरा करने के लिए: आप नए ऑपरेटरों को परिभाषित नहीं कर सकते; लेकिन << एक नया ऑपरेटर नहीं है, यह एक मौजूदा है, और यह कक्षा __lshift__ विधि में परिभाषित करके अधिभारित है।

एक ऐतिहासिक नोट के रूप में, यह सी ++ में भी काफी स्थिति है - लेकिन ऑपरेटरों का सटीक सेट जो आप अधिभारित कर सकते हैं, दोनों भाषाओं के बीच अलग है। उदाहरण के लिए, सी ++ में, आप गुण एक्सेस को अधिभारित नहीं कर सकते हैं, .; पायथन में, आप __getattr__ (या __getattribute__, विभिन्न अर्थशास्त्र के साथ) और __setattr__ के साथ कर सकते हैं। इसके विपरीत, पायथन = (सादा असाइनमेंट) में ऑपरेटर नहीं है, इसलिए आप इसे अधिभारित नहीं कर सकते हैं, जबकि सी ++ में यह एक ऑपरेटर है और आप इसे अधिभारित कर सकते हैं।

<< एक ऑपरेटर है, और दोनों भाषाओं में, अतिभारित किया जा सकता - कि कैसे << और >> है, जबकि बाएँ और दाएँ बदलाव के अपने शुरुआती अर्थ खोने नहीं, यह भी अजगर में आई/सी में हे स्वरूपण ऑपरेटरों ++ (नहीं बन गया -)।

+0

+1। मुझे यह लिंक अन्य प्रश्नों के उत्तर में नहीं मिला कि इस प्रश्न को डुप्लिकेट माना जाता है। – ToolmakerSteve

6

देखें: http://docs.python.org/reference/datamodel.html#special-method-names

एक कक्षा विशेष नामों के साथ विधियों को परिभाषित करके विशेष वाक्यविन्यास (जैसे अंकगणितीय परिचालन या सबस्क्रिप्टिंग और टुकड़ा) द्वारा लागू कुछ संचालन को कार्यान्वित कर सकती है। ऑपरेटर ओवरलोडिंग के लिए यह पायथन का दृष्टिकोण है, जिससे वर्ग ऑपरेटरों के संबंध में कक्षाएं अपने व्यवहार को परिभाषित करने की अनुमति देती हैं।

4

हां, और नहीं। मुझे नहीं लगता कि आप अपने ऑपरेटरों को परिभाषित कर सकते हैं, लेकिन आप मौजूदा लोगों को अधिभारित कर सकते हैं - आप ऑपरेटर की विशेष विधि को ओवरराइड करके ऐसा कर सकते हैं। उदाहरण के लिए, ओवरराइड करने के लिए>, आप __gt__() को ओवरराइड कर सकते हैं! = 0rओवरराइड करें और इसी तरह।

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