데커레이터의 핵심 특징은 데커레이터된 함수가 정의된 직후에 실행된다는 것으로 일반적으로 파이썬이 모듈을 로딩하는 시점,즉 임포트 타임에 실행된다.
registry = []
def register(func):
print('running register(%s)' % func)
registry.append(func)
return func
@register
def f1():
print('running f1()')
@register
def f2():
print('running f2()')
@register
def f3():
print('running f3()')
def main():
print('running main()')
print('registry->', registry)
f1()
f2()
f3()
if __name__=='__main__':
main()
register()는 모듈 내의 다른 어떠한 함수보다 먼저 실행 (두 번)되고, register()가 호출될 때 데커레이터된 함수를 인수로 받는다.
모듈이 로딩된 후 registry는 데커레이터된 두 개의 함수 f1()과 f2()에 대한 참조를 가진다. 이 두 함수는 main()에 의해 명시적으로 호출될 때만 실행된다.
import registration
registration.registry
함수 데커레이터는 모듈이 임포트되자마자 실행되지만, 데커레이트된 함수는 명시적으로 호출될 때만 실행됨을 알 수 있다.