对书中1-2 示例中的笔记
1.我们自定义实现一个类,如何实现这个类的加法,乘法,模等性质呢?
以二维向量为例。
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 __bool__(self):
return bool(abs(self))
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)
2.首先比较重要的是这个__repr__。它的返回值是我们在读取这个对象时显示的一条字符串,可以让我们读取这个二维向量的信息。它与__str__的区别在于后者倾向于读者友好型,前者方便程序员。
有了这个方法,可以看到我们接下来的add 和mul都return一个对象实例,这个对象实例在返回时其实就调用了__repr__中的这个返回值,所以我们在+或-时可以将结果易读地显示在交互台上。
3. __add__ 和 __mul__其实分别实现的是加法乘法。注意加法的参数other,乘法的参数scalar。加法操作时并未改变self.x(y) 或 other.x(y),而是创建了新的变量,乘法也是如此。这基于算术运算的原则,不改变参与计算的值。
4.bool方法是用来判断真假的,所以在它的返回值里我们使用了bool函数来确保返回的是一个bool值。当对象不存在bool方法时,会调用len去判断,若长度为0则为假,否则为真。我们定义二维向量中模为0为假,否则为真。因此模为0时,调用bool会返回False。 Python解释器在遇到if + object 时, 应该会调用对象的bool方法。
5.并不是很了解hypot, 等了解后再写。总之abs是一个计算绝对值或模的一个函数。