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?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
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).
Method 2
In Python 3, the division operators are called __truediv__ and __floordiv__. See the Data model documentation for more information.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0