2012-06-29 22 views
14

Tengo una clase vectorial y definí el método __mul__ para multiplicar un vector por un número.¿Definir alias de método en Python?

Aquí es el método __mul__:

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

Mi problema es que no sé que es lo que entre el número y el vector. Si self es el número, self.x provoca un error. (Estoy confundiendo quizás en este punto:? Es "otro" siempre un número)

así que encontré aquí: Python: multiplication override que podía hacer:

__rmul__ = __mul__ 

pero ¿cómo puedo hacer que en una definición de clase?

Algo así como:

def __rmul__ = __mul__ 

Respuesta

18

self nunca será el número de __mul__() porque el objeto del método está unido a no es el número, es el vector, y por definición es el multiplicando

other será un número si su objeto se está multiplicando por un número. O podría ser otra cosa, como otro vector, que podrías probar y manejar.

Cuando su objeto es el multiplicador, se llama a __rmul__() si el multiplicando no sabe cómo manejar la operación.

Para manejar el caso en el que __mul__ y __rmul__ deben ser del mismo método, debido a que la operación es conmutativa, puede simplemente hacer la asignación en la definición de su clase.

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

    __rmul__ = __mul__ 
9

enumeran simplemente como un atributo:

__rmul__ = __mul__ 

Ésta es la misma manera en que se crea un alias de una función en un módulo; crear un alias de un método dentro de un cuerpo de clase funciona de la misma manera.

3

El punto es que en Python, puedes decirle a los objetos cómo multiplicarse por las cosas. Eso significa que

a * b 

podría significar tanto "decir a multiplicarse por b" o "decir b multiplicarse por a". En el código, que se traduce en

a.__mul__(b) 

o

b.__rmul__(a) 
+0

¿Hay alguna manera de saber cuál se llamará? –

+1

'__mul__' primero, luego' __rmul__' si eso falla. – katrielalex

+3

mejor: o "diga b para multiplicar a por sí mismo (b)". El operador de multiplicación no tiene que ser conmutativo. – glglgl

Cuestiones relacionadas