试图重载运算符“/”时出错

2024-05-16 09:40:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近开始自学游戏编程。有人推荐我从Python开始,我得到了一本书“用Python和Pygame开始游戏开发:从新手到专业人士”。我学到了一部分,他们教向量和创建向量2类。一切都进行得很顺利,直到我试着让部门接线员超载。 我的代码是这样的:

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)

现在,当我试图呼叫“/”接线员时,显示:

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'

这都是在Python3.3中完成的,但是如果我用Python2.7运行它,一切都会正常工作。 问题在哪里?


Tags: self游戏returnabdefv3向量cls
2条回答

在Python 3.x中,需要重载__floordiv____truediv__运算符,而不是__div__运算符。前者对应于//操作(返回整数),后者对应于/(返回浮点数)。

在Python 3中,除法运算符被称为__truediv____floordiv__。有关详细信息,请参阅Data model文档。

相关问题 更多 >