我们可以把 Vector2d 实例转换成字节序列了;同理,也应该能从字节序列转换成 Vector2d 实例。在标准库中探索一番之后,我们发现 array.array 有个类方法 .frombytes(2.9.1 节介绍过)正好符合需求。下面在 vector2d_v1.py(见示例 9-3)中为 Vector2d 定义一个同名类方法。

示例 9-3 vector2d_v1.py 的一部分:这段代码只列出了 frombytes 类方法,要添加到 vector2d_v0.py(见示例 9-2)中定义的Vector2d 类中

    @classmethod  ➊
    def frombytes(cls, octets):  ➋
        typecode = chr(octets[0])  ➌
        memv = memoryview(octets[1:]).cast(typecode)  ➍
        return cls(*memv)  ➎

❶ 类方法使用 classmethod 装饰器修饰。

❷ 不用传入 self 参数;相反,要通过 cls 传入类本身。

❸ 从第一个字节中读取 typecode

❹ 使用传入的 octets 字节序列创建一个 memoryview,然后使用 typecode 转换。4

42.9.2 节简单介绍过 memoryview,说明了它的 .cast 方法。

❺ 拆包转换后的 memoryview,得到构造方法所需的一对参数。

我们用的 classmethod 装饰器是 Python 专用的,下面讲解一下。