27

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__

3 Answers 3

33

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__
Sign up to request clarification or add additional context in comments.

4 Comments

Am I right in concluding that you are doing the assignment in the init method ?
no, it's in the class definition.
Ok thanks I googled for an example of this but could not find one. Final question. By putting it in the class definition the method alias assignment has global scope ?
global as in all instances of that class will have that behavior, yes.
16

Simply list it as an attribute:

__rmul__ = __mul__

This is the same way you'd create an alias of a function in a module; creating an alias of a method within a class body works the same.

Comments

4

The point is that in Python, you can tell objects how to multiply themselves by things. That means that

a * b

could either mean "tell a to multiply itself by b" or "tell b to multiply itself by a". In code, that translates to

a.__mul__(b)

or

b.__rmul__(a)

3 Comments

Is there a way to know which one will be called?
__mul__ first, then __rmul__ if that fails.
better: or "tell b to multiply a by itself (b)". The multiplication operator doesn't have to be commutative.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.