不仅 Python 函数是真正的对象,任何 Python 对象都可以表现得像函数。为此,只需实现实例方法 __call__。
import random class BingoCage: def __init__(self, items): self._items = list(items) ➊ random.shuffle(self._items) ➋ def pick(self): ➌ try: return self._items.pop() except IndexError: raise LookupError('pick from empty BingoCage') ➍ def __call__(self): ➎ return self.pick()
❶ __init__ 接受任何可迭代对象;在本地构建一个副本,防止列表参数的意外副作用。
❷ shuffle 定能完成工作,因为 self._items 是列表。
❸ 起主要作用的方法。
❹ 如果 self._items 为空,抛出异常,并设定错误消息。
❺ bingo.pick() 的快捷方式是 bingo()。
输出示例:
>>> bingo = BingoCage(range(3)) >>> bingo.pick() 1 >>> bingo() 0 >>> callable(bingo) True