5.5 用户定义的可调用类型

不仅 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
原文地址:https://www.cnblogs.com/wjw2018/p/10672361.html