2015-06-18 18 views
8

पायथन के मानक ऑपरेटरों की सूची में __add__(a, b) और __concat__(a, b) दोनों शामिल हैं। उनमें से दोनों आमतौर पर a + b द्वारा बुलाए जाते हैं। मेरा सवाल है, उनके बीच क्या अंतर है? क्या कोई परिदृश्य है जहां दूसरे के बजाए इस्तेमाल किया जाएगा? क्या कोई कारण है कि आप दोनों एक ही वस्तु पर परिभाषित करेंगे?पायथन के __add__ और __concat__ के बीच क्या अंतर है?

यहाँ documentation मैं तरीकों में उल्लेख पाया

संपादित है:। Weirdness को जोड़ने से इस documentation है:

अंत में, अनुक्रम प्रकार इसके अलावा (अर्थ संयोजन) और गुणा लागू करना चाहिए (जिसका अर्थ है पुनरावृत्ति) विधियों को परिभाषित करके __add__(), __radd__(), __iadd__(), __mul__(), __rmul__() और __imul__() नीचे वर्णित; उन्हें __coerce__() या अन्य संख्यात्मक ऑपरेटरों को परिभाषित नहीं करना चाहिए।

+0

खैर प्रलेखन आप एक से जुड़ा हुआ के अनुसार संख्या के लिए है और एक कि '__concat__' एक *" जादू विधि "की तरह नहीं है * दृश्यों के लिए है – Craicerjack

+2

नोट' __add__' है: https: // डॉक्स .python.org/2/संदर्भ/डेटामोडेल.html – jonrsharpe

+0

* क्या नाम के अलावा * कोई अंतर है? – user2864740

उत्तर

7

आप operator मॉड्यूल (add, concat) के लिए स्रोत की जाँच हैं, तो आप उन कार्यों के लिए इन परिभाषाओं मिलेगा:

def add(a, b): 
    "Same as a + b." 
    return a + b 

def concat(a, b): 
    "Same as a + b, for a and b sequences." 
    if not hasattr(a, '__getitem__'): 
     msg = "'%s' object can't be concatenated" % type(a).__name__ 
     raise TypeError(msg) 
    return a + b 

तो वहाँ वास्तव में उस concat को छोड़कर कोई अंतर नहीं है वास्तव में एक दृश्य की आवश्यकता है प्रकार। दोनों कार्य + ऑपरेटर का उपयोग करते हैं जो प्रभाव आपके द्वारा जोड़े गए प्रकारों पर निर्भर करता है।

सामान्यतः, operator module का उपयोग करना उस समय अधिक उपयोगी नहीं है। मॉड्यूल का अधिकतर उपयोग होता है जब आपको एक ऑपरेशन करने वाले फ़ंक्शन को पास करने की आवश्यकता होती है, उदाहरण के लिए map, filter, या reduce जैसे कार्यात्मक कार्यों के लिए। लेकिन आमतौर पर, आप सीधे + ऑपरेटर का उपयोग कर सकते हैं।

अंडरस्कोर कार्य (__add__ और __concat__) के रूप में, इन just aliases हैं:

__add__ = add 
__concat__ = concat 

लेकिन उन हैं निश्चित रूप से special methods कस्टम प्रकार के लिए ऑपरेटरों को ओवरलोड करने के लिए इस्तेमाल से संबंधित नहीं।वे ऐसे कार्य हैं जो समान नामों के समान नाम से मेल खाते हैं, शायद उन्हें समान दिखने के लिए। ध्यान दें कि वस्तुओं पर कोई विशेष __concat__ विधि नहीं है।

एक कस्टम प्रकार पर __add__ को लागू करने हालांकि प्रभावित करने के तरीके ऑपरेटर मॉड्यूल कार्यों काम करते हैं, उदाहरण के लिए होगा:

>>> class Example: 
     def __init__ (self, x): 
      self.x = x 
     def __repr__ (self): 
      return 'Example({})'.format(self.x) 
     def __add__ (self, other): 
      return Example(self.x + other.x) 

>>> a = Example(2) 
>>> b = Example(4) 
>>> operator.add(a, b) 
Example(6) 
>>> a + b 
Example(6) 

आप देख सकते हैं, operator.add विशेष विधि Example.__add__ के कार्यान्वयन का उपयोग करेगा; लेकिन इसका कारण यह है कि operator.add का कार्यान्वयन सिर्फ + ऑपरेटर का उपयोग करता है (जो व्यवहार विशेष रूप से विशेष __add__ विधि द्वारा परिभाषित किया गया है)।

+0

अच्छी तरह से, ऑपरेटर पास मॉड्यूल को कम करने के लिए ऑपरेटर 'मॉड्यूल उपयोगी है() ' – fferri

+1

@mescalinum मैंने यही लिखा है: *" मॉड्यूल का अधिकतर उपयोग होता है जब आपको एक ऑपरेशन करने वाले फ़ंक्शन को पास करने की आवश्यकता होती है। "* – poke

+0

ठीक है। मुझे बस 'कम() 'का उल्लेख करना पसंद आया क्योंकि कार्यात्मक प्रोग्रामिंग बहुत अच्छा है :) – fferri

3
  • operator.__add__(a, b): a + b, a के लिए और bसंख्या * लौटें।
  • operator.__concat__(a, b): a और bदृश्यों के लिए लौटें a + b

क्या अंतर है?

उदाहरण के लिए, आप पूर्णांक जोड़ नहीं कर सकते हैं:

>>> operator.__concat__(2,3) 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
TypeError: 'int' object can't be concatenated 

  • वास्तव में __add__(a, b) सिर्फ a + b करता है, इसलिए यह भी दृश्यों पर काम करता है।
0

डॉक्स के अनुसार,

operator.__add__(a, b) वापसी ए + बी, ए और बी की संख्या के लिए।

operator.__concat__(a, b) ए और बी अनुक्रमों के लिए एक + बी लौटाएं।

ऑपरेटर __ जोड़ने .__ (ए, बी):

यह सिर्फ a + b करते हैं और परिणाम देने की कोशिश करेंगे।

ईजी।

operator.__add__(1,2) # performs 1 + 2 
3 

operator.__add__('a','b') # performs 'a'+'b' 
'ab' 

ऑपरेटर .__ concat __ (ए, बी):

यहाँ, यह अगर a विशेषता __getitem__ है की जाँच करेगा। यदि इसमें __getitem__ विशेषता नहीं है तो यह एक अपवाद उठाता है अन्यथा a + b करने का प्रयास करें।

ईजी।

संख्याओं पर इस परिचालन को करने पर, यह एक अपवाद उठाएगा।

operator.__concat__(1,2) 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
TypeError:'int' object can't be concatenated 

दो तारों पर प्रदर्शन करते समय, यह स्ट्रिंग concatenation प्रदर्शन करते हैं।

operator.__concat__('a','b') 
'ab' 
+0

क्या व्यवहार * वास्तव में * भिन्न/सीमित है? 'operator.add (" a "," b ") 'अपेक्षित परिणाम (' "a" + "b" => "ab" ') उत्पन्न करता है और दस्तावेज़ीकरण कहता है कि दोनों" ए + बी लौटें "। – user2864740

+0

ध्यान दें कि ओपी 'ऑपरेटर' मॉड्यूल के बारे में बात कर रहा था, विशेष तरीकों से नहीं। यह भी ध्यान रखें कि कोई विशेष '__concat__' विधि नहीं है। – poke

+0

ने उत्तर को अपडेट किया। –

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