परिभाषित करना __add__ (और अन्य जादू के तरीके) गतिशील रूप से [डुप्लिकेट]
 Nov 24 2020
मैंने सुना है कि इसका a + bविस्तार होता है a.__add__(b)। हालाँकि, यह मेरे कोड में उस तरह काम नहीं करता है। यह कोड लें:
class TestAdd:
    def __init__(self, a):
        self.a = a
    def __getattr__(self, name):
        if name == '__add__':
            return (lambda y: self.a + y)
जब मैं कोशिश करता हूं TestAdd(5).__add__(1), तो यह 6 सही ढंग से लौटता है। जब मैं कोशिश करता हूं TestAdd(5) + 1, तो यह त्रुटि उठाता है:
TypeError                                 Traceback (most recent call last)
<ipython-input-3-1c04c7082b89> in <module>
----> 1 TestAdd(5) + 1
TypeError: unsupported operand type(s) for +: 'TestAdd' and 'int'
ऐसा क्यों है? क्या मैं कुछ भूल रहा हूँ?
जवाब
chepner Nov 24 2020 at 03:11
जादू के तरीकों को उदाहरणों पर नहीं देखा जाता है, लेकिन कक्षाओं पर। TestAdd(5) + 1के बराबर है tmp = TestAdd(5); TestAdd.__add__(tmp, 1), और आपने परिभाषित नहीं किया है TestAdd.__add__।
AKX Nov 24 2020 at 03:10
आप __getattr__एक जादुई विधि को गतिशील रूप से वापस करने के लिए उपयोग नहीं कर सकते हैं ; यह मैनुअल में 3.3.10 विशेष विधि देखने में गहराई से प्रलेखित है ।