2011-10-14 21 views
8

Ho una classe Vec3D (vedi http://pastebin.com/9Y7YbCZq)Override + operatore in Python per float + obj

Attualmente, mi permetto Vec3D (1,0,0) + 1.2 ma mi chiedo come devo procedere al sovraccarico l'operatore + in modo tale che ottengo il seguente output:

>>> 3.3 + Vec3D(1,0,0) 
[4.3, 3.3 , 3.3] 

codice non è necessario, ma solo un accenno in quale direzione dovrei guardare. Qualcosa generale sarà più utile di una specifica implementazione, come ho bisogno di attuare la stessa cosa per la moltiplicazione, sottrazione ecc

+0

Non ho visto "Qualcosa di generale sarà più utile di un'implementazione specifica in quanto ho bisogno di implementare la stessa cosa per la moltiplicazione, la sottrazione, ecc." parte ma il collegamento nella mia risposta ti porterà alla [lista dei metodi magici usati per emulare un tipo numerico] (http://docs.python.org/reference/datamodel.html#emulating-numeric-types). – agf

+1

Va bene, ho smesso di leggere dopo "Stai cercando __radd__" e ho fatto clic sul link :) Tuttavia, il tuo codice lo ha reso molto più chiaro, quindi grazie –

+0

Se hai un __add __() personalizzato per la tua classe, quindi subito dopo la sua definizione è possibile includere solo una riga '__radd__ = __add__'. Questo funziona perché radd scambia l'ordine degli argomenti per te. –

risposta

10

Siete alla ricerca di __radd__:

class MyClass(object): 
    def __init__(self, value): 
     self.value = value 
    def __radd__(self, other): 
     print other, "radd", self.value 
     return self.value + other 


my = MyClass(1) 

print 1 + my 
# 1 radd 1 
# 2 

Se l'oggetto sulla sinistra del Inoltre non supporta l'aggiunta dell'oggetto a destra, l'oggetto a destra viene controllato per il metodo magico __radd__.

3

attrezzo __radd__. Quando chiami 3.3 + Vec3D(1,0,0), finché float non ha il metodo __add__(y) con ye Vec3D, verrà chiamata la tua versione riflessa __radd__.