2014-02-18 44 views
17

我最近开始自学游戏编程。有人建议我先从Python开始,然后我得到了这本书“用Python和Pygame开始游戏开发:从新手到专业”。我得到了他们教Vector的一部分并创建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,一切工作正常。 问题在哪里?

+0

你知道你重新发明numpy功能吗? –

+0

请参阅http://docs.python.org/3/library/operator.html#operator.__truediv__ – zhangxaochen

+0

我相信我会知道什么是numpy。但是,我正试图从Python学习这些东西。我没有经验。 – darkwatcher5

回答

28

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

+0

我只是测试它,它的工作原理!感谢你的回答。我将不得不阅读一些文档。 – darkwatcher5

+0

@python2中的darkwatcher5,整数除法的结果总是一个整数。这意味着'5/2 == 2',尽管'5/2.0 == 2.5'。 Python3改变了这种情况(由于最不惊讶的原则)并用'__floordiv__'(它是'5 // 2 == 2')和'__truediv__'(它是'5/2 == 2.5')取代'__div__'。 –

+0

@adsmith似乎真的很有用。而且很具体。 – darkwatcher5

5

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

+0

谢谢,我现在要做一些阅读,我真的需要它。 – darkwatcher5