46

I recently start teaching myself game programming. Someone recommend me to start with Python and I got the book "Beginning game development with Python and Pygame: From novice to professional". I got to a part where they teach about Vectors and creating a Vector2 class. Everything was going well until I tried to overload the division operator. My code goes like this:

class Vector2(object): def __init__(self, x=0.0, y=0.0): self.x = x self.y = y def __str__(self): return "(%s, %s)"%(self.x, self.y) @classmethod def from_points(cls, P1, P2): return cls(P2[0] - P1[0], P2[1] - P1[1]) def __add__(self,rhs): return Vector2(self.x + rhs.x, self.y + rhs.y) def __sub__(self,rhs): return Vector2(self.x - rhs.x, self.y - rhs.y) def __mul__(self, scalar): return Vector2( self.x*scalar, self.y*scalar) def __div__(self, scalar): return Vector2( self.x/scalar, self.y/scalar) 

Now, when I tried to call the "/" operator, this shows up:

AB = Vector2(10.0,25.0) print(AB) # <<<<(10.0, 25.0) v1 = AB + Vector2(20.,10.) print(v1) # <<<<(30.0, 35.0) v2 = AB - Vector2(20.,10.) print(v2) # <<<<(-10.0, 15.0) v3 = AB * 3 print(v3) # <<<<(30.0, 75.0) print(v3 / 3) TypeError: unsupported operand type(s) for /: 'Vector2' and 'int' 

This was all in Python 3.3 but if I run it with Python 2.7, everything works correctly. Where's the problem?

2

2 Answers 2

87

In Python 3.x, you need to overload the __floordiv__ and __truediv__ operators, not the __div__ operator. The former corresponds to the // operation (returns an integer) and the latter to / (returns a float).

Sign up to request clarification or add additional context in comments.

3 Comments

I just tested it and it works! Thanks for the answer. I'll have to do some reading on the docs.
@darkwatcher5 in python2, the result of integer division was always an integer. This means 5/2 == 2, though 5/2.0 == 2.5. Python3 changed that (due to the principle of least astonishment) and replaced __div__ with __floordiv__ (which is 5//2 == 2) and __truediv__ (which is 5/2 == 2.5)
@adsmith Seems really useful to be honest. And much specific.
7

In Python 3, the division operators are called __truediv__ and __floordiv__. See the Data model documentation for more information.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.