2012-06-29 16 views
14

मेरे पास एक वेक्टर क्लास है और मैंने __mul__ विधि को एक वेक्टर को गुणा करने के लिए परिभाषित किया है।पायथन में विधि उपनाम परिभाषित करें?

def __mul__(self, other): 
    x = self.x * other 
    y = self.y * other 
    new = Vector() 
    new.set_pos((x, y)) 
    return new 

मेरे समस्या मैं नहीं जानता कि वह यह है कि जो है जो संख्या और वेक्टर के बीच:

यहाँ __mul__ तरीका है। यदि स्वयं नंबर है, self.x एक त्रुटि उठाता है। (मैं शायद इस मुद्दे पर भूल कर रहा हूँ: है? "अन्य" हमेशा एक नंबर)

तो मैं यहां मिली: Python: multiplication override मैं कर सकता है कि:

__rmul__ = __mul__ 

लेकिन मैं कैसे कर सकते हैं एक में है कि कक्षा परिभाषा?

कुछ की तरह:

def __rmul__ = __mul__ 

उत्तर

18

self__mul__() में नंबर कभी नहीं होगा क्योंकि वस्तु विधि से जुड़ा हुआ है संख्या, नहीं है, यह वेक्टर है, और परिभाषा यह है गुणक।

other एक संख्या होगी यदि आपकी वस्तु को किसी संख्या से गुणा किया जा रहा है। या यह कुछ और हो सकता है, जैसे कि एक और वेक्टर, जिसे आप परीक्षण और संभाल सकते हैं।

जब आपका ऑब्जेक्ट गुणक है, __rmul__() कहा जाता है कि क्या मल्टीप्लिकैंड ऑपरेशन को संभालने के बारे में नहीं जानता है।

उस मामले को संभालने के लिए जिसमें __mul__ और __rmul__ समान विधि होनी चाहिए, क्योंकि ऑपरेशन कम्यूटिव है, आप केवल अपनी कक्षा परिभाषा में असाइनमेंट कर सकते हैं।

class Vector(object): 
    def __mul__(self, other): 
     pass 

    __rmul__ = __mul__ 
9

, बस एक विशेषता के रूप में यह सूची:

__rmul__ = __mul__ 

यह तरीका एक मॉड्यूल में एक समारोह का एक उपनाम बनाएं होता है; एक वर्ग निकाय के भीतर एक विधि का उपनाम बनाना वही काम करता है।

3

बिंदु यह है कि पायथन में, आप वस्तुओं को बता सकते हैं कि चीजों से खुद को गुणा कैसे करें। इसका मतलब है कि

a * b 

या तो मतलब है "a बता b से ही गुणा करने के लिए" कर सकता है या "b बता a से ही गुणा करने के लिए"। कोड में, कि

a.__mul__(b) 

या

करने के लिए अनुवाद
b.__rmul__(a) 
+0

क्या यह जानने का कोई तरीका है कि कौन सी कॉल की जाएगी? –

+1

'__mul__' पहले, फिर' __rmul__' अगर यह विफल हो जाता है। – katrielalex

+3

बेहतर: या "बी को अपने आप को गुणा करने के लिए बताएं (बी)"। गुणात्मक ऑपरेटर को कम्यूटिव नहीं होना चाहिए। – glglgl

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