【问题标题】:Error when trying to overload an operator "/"尝试重载运算符“/”时出错
【发布时间】:2014-03-18 12:59:12
【问题描述】:

我最近开始自学游戏编程。有人推荐我从 Python 开始,我得到了《用 Python 和 Pygame 开始游戏开发:从新手到专业人士》一书。我到了他们教 Vectors 和创建 Vector2 类的部分。一切都很顺利,直到我试图重载除法运算符。 我的代码是这样的:

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'

这一切都在 Python 3.3 中,但如果我用 Python 2.7 运行它,一切正常。 问题出在哪里?

【问题讨论】:

标签: python python-3.x operator-overloading vector-graphics


【解决方案1】:

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

【讨论】:

  • 我刚刚测试了它,它可以工作!感谢您的回答。我必须阅读文档。
  • @darkwatcher5 在 python2 中,整数除法的结果总是整数。这意味着5/2 == 2,尽管5/2.0 == 2.5。 Python3 改变了这一点(由于最小惊讶原则)并将__div__ 替换为__floordiv__(即5//2 == 2)和__truediv__(即5/2 == 2.5)
  • @adsmith 老实说似乎真的很有用。而且非常具体。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    相关资源
    最近更新 更多