不仅 Python 函数是真正的对象,任何 Python 对象都可以表现得像函数。为此,只需实现实例方法 __call__。
import randomclass 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