Define method aliases in Python?

Jérôme Martin picture Jérôme Martin · Jun 29, 2012 · Viewed 12.7k times · Source

I have a vector class and I defined the __mul__ method to multiply a vector by a number.

Here is the __mul__ method :

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

My problem is that I don't know which is which between the number and the vector. If self is the number, self.x raises an error. (I'm maybe mistaking on this point : Is "other" always a number ?)

So I found here : Python: multiplication override that I could do :

__rmul__ = __mul__

but how can I do that in a class definition ?

Something like :

def __rmul__ = __mul__

Answer

kindall picture kindall · Jun 29, 2012

self will never be the number in __mul__() because the object the method is attached to is not the number, it's the vector, and by definition it's the multiplicand.

other will be a number if your object is being multiplied by a number. Or it could be something else, such as another vector, which you could test for and handle.

When your object is the multiplier, __rmul__() is called if the multiplicand doesn't know how to handle the operation.

To handle the case in which __mul__ and __rmul__ should be the same method, because the operation is commutative, you can just do the assignment in your class definition.

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

    __rmul__ = __mul__