我们可以把 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 专用的,下面讲解一下。