2011-08-20 12 views
19

मैंने पायथन (एक अभ्यास के रूप में) में वैक्टर का प्रतिनिधित्व करने के लिए एक कक्षा लिखी है और मुझे अंतर्निहित ऑपरेटरों को विस्तारित करने में समस्याएं आ रही हैं।उपयोगकर्ता परिभाषित __mul__ विधि कम्यूटिव नहीं है

मैंने वेक्टर वर्ग के लिए __mul__ विधि परिभाषित की। समस्या यह है कि x * y अभिव्यक्ति में दुभाषिया __mul__ x की विधि को कॉल करता है, न कि y।

तो vector(1, 2, 3) * 2 एक वेक्टर < 2, 4, 6> देता है जैसा कि इसे करना चाहिए; लेकिन 2 * vector(1, 2, 3) एक टाइप एरर बनाता है क्योंकि अंतर्निहित int कक्षा मेरे उपयोगकर्ता द्वारा परिभाषित वैक्टर द्वारा गुणा का समर्थन नहीं करती है।

मैं बस एक नया गुणा समारोह

def multiply(a, b): 
    try: 
     return a * b 
    except TypeError: 
     return b * a 

लिख कर इस समस्या को हल कर सकता है, लेकिन यह हर कार्य है कि मैं अपने उपयोगकर्ता परिभाषित वर्गों के साथ उपयोग करना चाहते हैं फिर से परिभाषित करने की आवश्यकता होगी।

क्या अंतर्निहित फ़ंक्शन इसे सही तरीके से संभालने का कोई तरीका है?

उत्तर

24

यदि आप विभिन्न प्रकार के लिए कम्यूटिटी चाहते हैं तो आपको __rmul__() लागू करने की आवश्यकता है। यदि कार्यान्वित किया जाता है, तो इसे सभी __r*__() विशेष तरीकों की तरह कहा जाता है, यदि ऑपरेशन अन्यथा TypeError उठाएगा। सावधान रहें कि तर्क लगा दिया जाता था:

class Foo(object): 
    def __mul_(self, other): 
     ''' multiply self with other, e.g. Foo() * 7 ''' 
    def __rmul__(self, other): 
     ''' multiply other with self, e.g. 7 * Foo() ''' 
+0

लिए देख रहे हैं कैसे अजगर आह्वान करने के लिए 'फू .__ rmul__' और नहीं पता है' अन्य वस्तु की __mul__'? –

+2

यह बाएं हाथ की '__mul__' का उपयोग करने का प्रयास करता है, और यदि उसे यह नहीं मिल रहा है, तो यह दाईं ओर' __rmul__' की तलाश करता है। –

+3

@pst, पायथन पहले '__mul__' कहते हैं, लेकिन यदि यह या तो मौजूद नहीं है या यदि यह 'लागू नहीं किया गया' वापस लौटाता है तो पाइथन अन्य ऑब्जेक्ट के' __rmul__' को कॉल करता है। (ध्यान दें कि यदि '__mul__' निष्पादन बढ़ाता है, तो' __rmul__' __not__ कहा जाता है। –

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