2012-05-07 9 views
8

मैंने हाल ही में पाइथन में ऑपरेटर ओवरलोडिंग के बारे में सीखा है और मैं जानना चाहता हूं कि निम्नलिखित संभव है या नहीं।ऑपरेटर के दाईं ओर ऑब्जेक्ट के साथ पाइथन में ऑपरेटर ओवरलोडिंग

फोलिंग हाइपोटेटिका/प्रदूषित वर्ग पर विचार करें।

class My_Num(object): 
    def __init__(self, val): 
     self.val = val 
    def __add__(self, other_num): 
     if isinstance(other_num, My_Num): 
      return self.val + other_num.val 
     else: 
      return self.val + other_num 

मुझे पता है कि जिस तरह से है कि ऊपर लिखा है, मैं इस

n1 = My_Num(1) 
n2 = My_Num(2) 
n3 = 3 
print n1 + n2 
print n1 + n3 

जैसे काम कर सकें और उन अपेक्षा के अनुरूप काम करेंगे। मुझे यह भी पता है कि जिस तरह से यह वर्तमान में लिखा है कि मैं इस

n1 = My_Num(1) 
n2 = 2 
print 2 + n1 

ऐसा नहीं कर सकते वहाँ वैसे भी इस के आसपास है? मुझे पता है कि यह उदाहरण दूषित है लेकिन मेरे पास एक ऐसा एप्लिकेशन है जिसमें यह बहुत उपयोगी होगा अगर मैंने ऑपरेटर ओवरलोडिंग किया था, जिस वर्ग के लिए मैं ऑपरेटर को परिभाषित करता हूं वह ऑपरेटर के दाईं ओर दिखाई दे सकता है। क्या यह अजगर में संभव है?

उत्तर

9

हां। उदाहरण के लिए, __radd__ है। इसके अलावा, there are none__le__(), __ge__(), आदि के लिए, लेकिन के रूप में जोएल Cornett ठीक ही देखता है, यदि आप केवल __lt__ परिभाषित करते हैं, a > bb की __lt__ समारोह है, जो एक वैकल्पिक हल प्रदान करता है कहता है।

>>> class My_Num(object): 
...  def __init__(self, val): 
...   self.val = val 
...  def __radd__(self, other_num): 
...   if isinstance(other_num, My_Num): 
...    return self.val + other_num.val 
...   else: 
...    return self.val + other_num 
... 
>>> n1 = My_Num(1) 
>>> n2 = 3 
>>> 
>>> print n2 + n1 
4 
>>> print n1 + n2 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unsupported operand type(s) for +: 'My_Num' and 'int' 

ध्यान दें कि कम से कम कुछ मामलों में यह इस तरह कुछ करने के लिए उचित है:

>>> class My_Num(object): 
...  def __init__(self, val): 
...   self.val = val 
...  def __add__(self, other_num): 
...   if isinstance(other_num, My_Num): 
...    return self.val + other_num.val 
...   else: 
...    return self.val + other_num 
...  __radd__ = __add__ 
+0

धन्यवाद। क्या __radd__ केवल एक है जो इसे अनुमति देता है? मेरे ऑपरेटरों के लिए मुझे अधिभारित करने वाले विशिष्ट ऑपरेटर >> और << ऑपरेटर हैं। क्या मैं बस भाग्य से बाहर हूं, मैं उन ऑपरेटरों के लिए ऐसा करना चाहता हूं? – martega

+0

नहीं। क्या आपने लिंक पर क्लिक किया था? '__rrshift__' है, और इसी तरह। – senderle

+1

प्रत्येक कक्षा के लिए कौन से ऑपरेटरों को परिभाषित किया जाता है, इसे नियंत्रित करके सीमित सीमा तक तुलना करना संभव है। यदि ए और बी में केवल __lt__ परिभाषित किया गया है, उदाहरण के लिए। एक ए थोड़ा सा अंत से संबंधित विधि को कॉल करेगा। –

1

आप __radd__ विधि (दाईं ओर अलावा) ओवरलोड है। आपका फ़ंक्शन आपके __add__ विधि जैसा दिखता है, उदाहरण:

def __radd__(self, other): 
    return self.val + other.val 
संबंधित मुद्दे