Python使用register的方式
示例 11-14 把 Tombola.register 當作類裝飾器使用。在 Python 3.3 之
前的版本中不能這樣使用 register,必須在定義類之后像普通函數那
樣調用,如示例 11-14 中最后那行注釋所述。
雖然現在可以把 register 當作裝飾器使用了,但更常見的做法還是把
它當作函數使用,用于注冊其他地方定義的類。例如,在
collections.abc 模塊的源碼中
(https://hg.python.org/cpython/file/3.4/Lib/_collections_abc.py),是這樣
把內置類型 tuple、str、range 和 memoryview 注冊為 Sequence 的
虛擬子類的:
Sequence.register(tuple)
Sequence.register(str)
Sequence.register(range)
Sequence.register(memoryview)
其他幾個內置類型在 _collections_abc.py 文件
(https://hg.python.org/cpython/file/3.4/Lib/_collections_abc.py)中注冊為
抽象基類的虛擬子類。這些類型在導入模塊時注冊,這樣做是可以的,
因為必須導入才能使用抽象基類:能訪問 MutableMapping 才能編寫
isinstance(my_dict, MutableMapping)。結束本章之前,還要解釋一下 Alex Martelli 在“水禽和抽象基類”中施展
的魔法。