>  기사  >  백엔드 개발  >  Python 데코레이터에 대한 자세한 설명

Python 데코레이터에 대한 자세한 설명

高洛峰
高洛峰원래의
2016-10-19 16:06:361171검색

데코레이터의 구문은 @로 시작하고 그 뒤에 데코레이터 함수 이름과 선택적 매개변수가 옵니다.

데코레이터 선언 다음에는 다음과 같이 데코레이팅된 함수와 데코레이팅된 함수의 선택적 매개변수가 있습니다.

@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 &#39;deco1&#39;
    return func
def deco2(func):
    print &#39;deco2&#39;
    return func   
@deco1
@deco2
def foo():
    print &#39;foo&#39;
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)

@deco2

def 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 &#39;[%s]:%s called&#39; %(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
#------------------


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.