web-dev-qa-db-ja.com

演算子「/」をオーバーロードしようとしたときのエラー

私は最近、自分自身にゲームプログラミングを教え始めます。誰かが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で実行すると、すべてが正しく機能します。問題はどこにありますか?

27
darkwatcher5

Python 3.xでは、__floordiv__演算子ではなく、__truediv__および__div__演算子をオーバーロードする必要があります。前者は//演算(整数を返す)と/への演算(浮動小数点を返す)。

46
isedev

Python 3では、除算演算子は__truediv__および__floordiv__。詳細は Data model のドキュメントを参照してください。

5
kwatford