데코레이터의 구문은 @로 시작하고 그 뒤에 데코레이터 함수 이름과 선택적 매개변수가 옵니다.
데코레이터 선언 다음에는 다음과 같이 데코레이팅된 함수와 데코레이팅된 함수의 선택적 매개변수가 있습니다.
@designator(dec_opt_args)
def func(func_args ):
....
사실 일반적으로 데코레이터는 함수, 함수 선언이 완료되면 호출되는 함수입니다. 호출이 데코레이터가 장식한 함수로 대체된 후.
예:
def deco(func): ... return func @deco def foo(): print 'foo' #----------------------------------- #等价如下: def deco(func): ... return func def foo(): print 'foo' foo = deco(foo) 如下例子: def deco1(func): print 'ok' return func @deco1 def foo(): print 'foo' foo() #输出-------------- #ok #foo #------------------
데코레이터를 사용하지 않는 경우 다음을 수행할 수 있습니다.
def deco1(func): print 'ok' return func def foo(): print 'foo' print foo #<function foo at 0x00AFE6F0> foo = deco1(foo) foo() #输出-------------- #ok #foo #------------------
둘을 비교하면 다음을 사용하여 확인할 수 있습니다. 데코레이터는 매우 간단합니다. 특히 엔터프라이즈 수준 개발에서는 더욱 그렇습니다.
여러 데코레이터를 겹쳐서 사용할 수도 있습니다.
def deco1(func): print 'deco1' return func def deco2(func): print 'deco2' return func @deco1 @deco2 def foo(): print 'foo' foo() #输出如下:----------- #deco2 #deco1 #foo #---------------------
은 다음과 동일합니다.
@deco1 @deco2 def foo(arg):pass -----------与下等效---------- foo = deco1(deco2(foo()))
2. 매개변수가 있거나 없는 데코레이터
위의 예에는 기본적으로 매개변수가 있으며, 매개변수가 없는 것이 더 간단합니다.
1. 매개변수 없음
@deco1
@deco2
def foo(arg):pass
---- ---
foo = deco1(deco2(foo()))
2. 🎜>
@deco1(deco_arg)@deco2def foo(arg):pass------------- --------foo = deco1(deco_arg)(deco2(foo()))함수를 매개변수로 받는 데코레이터를 반환합니다 3. 활용1. 참조 로그2. 성능 감지를 위한 타이밍 로직 추가3. 함수에 트랜잭션을 추가하는 기능4. 예시from time import ctime,sleep def deco(func): def decoIn(): print '[%s]:%s called' %(ctime(),func.__name__) return func return decoIn @deco def foo(): pass foo() sleep(4) for i in range(2): sleep(1) foo() #输出如下:-------- #[Fri Jul 05 10:45:04 2013]:foo called #[Fri Jul 05 10:45:09 2013]:foo called #[Fri Jul 05 10:45:10 2013]:foo called #------------------