(十四)把对象作为可调用的规则
上一章用闭包记住达标目标,也可以用对象保存目标,再通过 __call__ 响应圆括号调用:
# 实例保存目标,__call__ 让实例能像函数一样接收分钟数。
class GoalChecker:
def __init__(self, goal):
self.goal = goal
def __call__(self, minutes):
return minutes >= self.goal
check = GoalChecker(30)
print(check(35))
print(list(filter(check, [20, 35, 45])))
check.goal = 40
print(list(filter(check, [20, 35, 45])))得到 True、[35, 45]、[45]。filter 接收到的可调用对象现在是实例,内部执行 check(minutes) 时会进入它的 __call__。目标保存在实例属性中,改成 40 后,下一次筛选读取新目标。
闭包适合集中保存一段调用所需的外层状态;类可以同时为状态提供多种方法、属性与显示方式。两者都能交给上一章的回调接口,选择时看这个任务还需要组织哪些数据和操作。