2012-06-29 18 views
14

Ho una classe vettoriale e ho definito il metodo __mul__ per moltiplicare un vettore per un numero.Definire alias del metodo in Python?

Ecco il metodo __mul__:

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

mio problema è che non so quale è quale tra il numero e il vettore. Se self è il numero, self.x genera un errore. (Sto forse sbagliare su questo punto:? È "altro" sempre un numero)

Così ho trovato qui: Python: multiplication override che avrei potuto fare:

__rmul__ = __mul__ 

ma come posso farlo in un definizione di classe?

Qualcosa di simile:

def __rmul__ = __mul__ 

risposta

18

self sarà mai il numero __mul__() poiché l'oggetto del metodo è attaccato non è il numero, è il vettore, e per definizione è il multiplicand.

other sarà un numero se il tuo oggetto viene moltiplicato per un numero. Oppure potrebbe essere qualcos'altro, come un altro vettore, che potresti testare e gestire.

Quando il tuo oggetto è il moltiplicatore, viene chiamato __rmul__() se il moltiplicatore non sa come gestire l'operazione.

Per gestire il caso in cui __mul__ e __rmul__ devono essere lo stesso metodo, poiché l'operazione è commutativa, è sufficiente eseguire l'assegnazione nella definizione della classe.

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

    __rmul__ = __mul__ 
9

Basta elencare come un attributo:

__rmul__ = __mul__ 

Questo è allo stesso modo che ci si crea un alias di una funzione in un modulo; la creazione di un alias di un metodo all'interno di un corpo di classe funziona allo stesso modo.

3

Il punto è che in Python, puoi dire agli oggetti come moltiplicare se stessi per le cose. Ciò significa che

a * b 

potrebbe significare sia "dire a moltiplicarsi da b" o "dire b moltiplicarsi da a". Nel codice, che si traduce

a.__mul__(b) 

o

b.__rmul__(a) 
+0

C'è un modo per sapere quale sarà chiamato? –

+1

'__mul__' prima, quindi' __rmul__' se fallisce. – katrielalex

+3

meglio: o "dì a b di moltiplicare a se stesso (b)". L'operatore di moltiplicazione non deve essere commutativo. – glglgl

Problemi correlati