파이썬 함수가 실제 객체일 뿐만 아니라, 모든 파이썬 객체가 함수처럼 동작할 수 있게 call()인스턴스 메서드 구현
"""
BingoCage 클래스를 구현한다.
반복 가능 객체를 받아서 한 항목을 담은 객체를 생성하고, 무작위 순으로 내부에 항목들의 리스트를 저장한다.
객체를 호출하면 항목을 하나 꺼낸다.
"""
#bingocall.py:BingoCage 클래스는 뒤섞인 리스트에서 항목을 골라낼 뿐이다.
import random
class BingoCage:
def __init__(self, items):
self._items = list(items)
random.shuffle(self._items)
def pick(self):
try:
return self._items.pop()
expert IndexError:
raise LookupError('pick from empty BingoCage')
def __call__(self):
return self.pick()
#callable() 내장 함수가 이 객체를 콜러블 객체로 인식하는지 주의하기
bingo = BingoCage(range(3))
bingo.pick()
bingo()
callable(bingo)
BingoCase의 경우 객체를 함수처럼 호출할 때마다 항목을 하나 꺼내서 변경 후 상태를 유지하는 call() 메서드를 구현하면 객체를 생성하기 쉽고, 데커레이터는 함수이긴 하지만 호출된 후의 상태를 '기억'할 수 있는 기능이 유용하게 사용된다.
클로저는 내부 상태를 가진 함수를 전혀 다른 방식으로 생성한다.