2016-07-27 15 views
5

जब एक नाव मूल्य के लिए एक पूर्णांक मान को जोड़ने के साथ अलग व्यवहार, मुझे एहसास हुआ कि __add__ विधि इस जैसे ठीक काम कर रहा है, तो नाव पर कहा जाता है,:पायथन: __add__ और +, नाव और पूर्णांक

>>> n = 2.0 
>>> m = 1 
>>> n.__add__(m) 
3.0 

लेकिन एक पूर्णांक पर बुलाया नहीं तो:

>>> m.__add__(n) 
NotImplemented 

पहले तो मैंने सोचा कि __add__ सिर्फ int और float प्रकार के लिए अलग तरह से लागू किया जा रहा था (नाव प्रकार प्रकार int करने के लिए जोड़ा जा करने के लिए स्वीकार करने की तरह है, लेकिन विपरीत नहीं)। तब मैंने देखा कि अगर मैं + ऑपरेटर का उपयोग करता हूं तो सब ठीक काम करता है:

>>> n + m 
3.0 
>>> m + n 
3.0 

क्या कोई जानता है कि यह क्यों हो रहा है? __add__ और + एक दूसरे से गहराई से संबंधित नहीं हैं?

+0

'नहीं कार्यान्वित' 'm .__ radd __ (n)' –

+0

@ इस-vidor के लिए भी वापस लौटा: गलत '__radd__' विधि। – user2357112

+0

@ user2357112 सच है! फिर वह समाधान है। –

उत्तर

6

a + b सीधे a.__add__(b) पर अनुवाद नहीं करता है। यह b.__radd__(a) भी कोशिश करता है यदि a.__add__ मौजूद नहीं है या NotImplemented देता है, या ba के प्रकार के उप प्रकार का एक उदाहरण है।

+0

मैं अभी भी उलझन में हूं। यह * anInt .__ के व्यवहार को कैसे समझाता है __ (aFloat) * == * नहीं कार्यान्वित * लेकिन * aFloat .__ जोड़ें __ (anInt) * एक फ्लोट योग उत्पन्न करता है? मुझे लगता है कि +/'__add__' दोनों कम्यूटिव होंगे? – RBV

+1

@ आरबीवी: न तो '+' और न ही '__add__' कम्यूटिव हैं। '+ 1] + [2]! = [2] + [1] ', और' __add__' मामलों के मामलों के लिए भी कम्यूटिव नहीं है जब '+' कम्यूटिव है क्योंकि केवल एक तर्क को ऑपरेशन को संभालने का तरीका जानने की जरूरत है। – user2357112

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