Error al intentar sobrecargar un operador “/”

Recientemente empecé a enseñarme progtwigción de juegos. Alguien me recomendó comenzar con Python y obtuve el libro “Desarrollo de juegos para principiantes con Python y Pygame: de principiante a profesional”. Llegué a una parte donde enseñan sobre vectores y crean una clase Vector2. Todo iba bien hasta que intenté sobrecargar al operador de la división. Mi código es el siguiente:

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) 

Ahora, cuando intenté llamar al operador “/”, aparece:

 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' 

Esto estaba todo en Python 3.3 pero si lo ejecuto con Python 2.7, todo funciona correctamente. ¿Dónde está el problema?

En Python 3.x, debe sobrecargar los operadores __floordiv__ y __truediv__ , no el operador __div__ . El primero corresponde a la operación // (devuelve un entero) y el último a / (devuelve un flotante).

En Python 3, los operadores de división se llaman __truediv__ y __floordiv__ . Consulte la documentación del modelo de datos para obtener más información.