一个简单的二维向量

from math import hypot
class Vector:
  def __init__(self, x=0, y=0):
    self.x = x
    self.y = y
  def __repr__(self):
    return 'Vector(%r, %r)' % (self.x, self.y)
  def __abs__(self):
    return hypot(self.x, self.y)
  def __add__(self, other):
    x = self.x + other.x
    y = self.y + other.y
    return Vector(x, y )
  def __mul__(self, scalar):
    return Vector(self.x * scalar, self.y * scalar)

这是一个简单的二维向量类,首先实例化它

v1 = Vector(2, 4)
v2 = Vector(2 ,1)
# 打印v1, 和v2
print v1
print v2
>>> Vector(2, 4)
>>> Vector(2, 1)

当我们打印v1, 和v2时,得到的是二维向量的值。
python有个内置的函数repr,它的作用是把对象用字符串的形式表达出来方便辨认。
在Vector类里,我们定义了__repr__方法,所以这里我们能打印出对象的返回值,而不是<Vector object at 0x10e100080>

v = Vector(3, 4)
print abs(v)
>>> 5.0

abs也是一个内置函数,它返回输入值的绝对值。如果输入的是复数,那么返回复数的模(a的二次方+b的二次方的和开平方根)。
所以我们在定义__abs__的时候里调用了math模块的hypot方法,hypot方法返回欧几里德范数sqrt(x*x+y*y)
__add____mul__方法则是可以让二维向量进行加法和乘法运算。

v1 = Vector(2, 4)
v2 = Vector(2 ,1)
print v1 + v2
>>> Vector(4, 5)
print v1 * 3
>>> Vector(6, 12)

再补充一个__nonzero__方法,使用bool()函数的时候会调用此方法。
在python3中已经替换为__bool__


From zero to hero