python - Error al intentar sobrecargar un operador "/"
python-3.x operator-overloading (2)
Recientemente empecé a enseñarme programació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 va así:
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, los operadores de división se llaman __truediv__
y __floordiv__
. Consulte la documentación del modelo de datos para obtener más información.
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).