fluent Python 读书笔记(二)

对书中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是一个计算绝对值或模的一个函数。

你可能感兴趣的:(Python学习)