> 백엔드 개발 > 파이썬 튜토리얼 > Python의 데코레이터란 무엇입니까? Python의 데코레이터 소개

Python의 데코레이터란 무엇입니까? Python의 데코레이터 소개

不言
풀어 주다: 2018-09-13 16:50:24
원래의
2924명이 탐색했습니다.

이 기사에서는 Python의 데코레이터가 무엇인지 소개합니다. Python의 데코레이터 도입은 참고할만한 가치가 있습니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

1. 데코레이터란 무엇입니까

데코레이터는 본질적으로 다른 함수가 코드를 변경하지 않고도 추가 기능을 추가할 수 있도록 하는 Python 함수입니다.

데코레이터는 핵심 코드를 수정하지 않고도 핵심 코드 부분의 기능을 향상시킵니다. 예를 들어 기능 앞에 로그, 권한 확인, 트랜잭션 처리 및 기타 시나리오를 삽입합니다.
그리고 함수함수와 전혀 관련이 없는 유사한 코드를 대량으로 추출하여 재사용할 수도 있습니다.

2. 초기 구현: 데코레이터가 아닌 데코레이터

  • 파이썬의 함수도 객체로 간주할 수 있으며, 변수에 할당할 수 있고 변수를 통해 함수를 호출할 수 있습니다.

예:

def foo():
   print("2017-06-08")
f = foo    # 将函数赋值给变量,f为函数对象
f()
# 返回结果:
2017-06-08
로그인 후 복사

3. 구문 sugar @는 간단한 데코레이터를 구현합니다

이제 foo()의 기능을 향상시키고 싶다고 가정해 보겠습니다. 예를 들어 함수 호출 전에 로그를 인쇄합니다. 하지만 나는 foo() 함수의 정의를 수정하고 싶지 않습니다. 코드가 실행되는 동안 동적으로 기능을 추가하는 방법을 "데코레이터"라고 합니다.
는 다음과 같습니다.

def testfunc(func):
    print('testfunc')
    def wrapper():
        print("%s %s() called" %(time.ctime(),func.__name__))
        return func()
    return wrapper
@testfunc 
def foo():
    print('foo1()')

foo()  # 相当于执行testfunc(foo) ->wrapper(foo) -> foo()
로그인 후 복사

실행 결과:

testfunc
Wed Sep 12 15:01:13 2018 foo() called
foo1()
로그인 후 복사

설명: foo()를 실행하기 전에 먼저 testfunc(foo)를 실행한 다음, 래퍼()를 실행하고 반환 시 foo() 자체를 호출합니다.

4. 특정 유형의 매개변수를 받는 데코레이터

  • 데코레이터가 반환한 함수가 호출되면 매개변수가 래핑 함수로 전달됩니다. 매개변수를 데코레이팅된 함수에 전달합니다.

는 다음과 같습니다.

def testfunc_with_args(func):
    def wrapper_argus(arg1, arg2):
        print("I got args! Look:", arg1, arg2)
        func(arg1, arg2)
    return wrapper_argus
@testfunc_with_args
def full_name(first_name, last_name):  # 带参数,将参数传给被装饰的函数
    print("My name is", first_name, last_name)

full_name("Peter", "Venkman")  # 调用
로그인 후 복사

실행 결과:

I got args! Look: Peter Venkman
My name is Peter Venkman
로그인 후 복사

5. 불확정 매개변수가 있는 데코레이터

데코레이터를 호출해야 하는 함수가 여러 개 있는데, 함수의 매개변수가 서로 다른 경우, 어떻게 해야 할까요? 구현해? 하나의 데코레이터에 해당하는 하나의 함수가 있을 수 없습니다. 이때 가변 매개변수를 갖는 데코레이터를 이용하여 구현할 수 있다.
다음과 같습니다.

def log(func):
    def wrapper(*args,**kwargs):        # 可接受各种参数
        print('call %s():'% func.__name__)
        return func(*args,**kwargs)     # 返回一个函数
    return wrapper                      # 装饰器返回一个函数,进入到wrapper()

@log      # @log放到now()的定义处,相当于执行语句:now = log(now)
def now_1(a,b):
    print('now()1:a+b = ',a+b)
@log
def now_2(a,b,c):
    print('now_2():a+b+c = ',a+b+c)

now_1(1,2)
now_2(1,2,3)
로그인 후 복사

실행해 보세요~

6. 다중 데코레이터

한 함수에 여러 함수를 추가하고 싶을 때 다중 레이어 데코레이터 사용을 고려해 볼 수 있지만, 데코레이터의 실행 순서에 주의해야 합니다. .
예:

# 注意代码的执行顺序
def deco_1(func):
    print('------111111------')
    def wrapper(*args,**kwargs):    # 包裹函数,参数与原函数的参数一致
        print('start: this is deco_1.')
        func(*args,**kwargs)
        print('end: deco_1.')
    return wrapper  # 返回值是一个包裹函数
def deco_2(func):
    print('------222222------')
    def wrapper(*args,**kwargs):
        print('start: this is deco_2.')
        func(*args,**kwargs)
        print('end: deco_2.')
    return wrapper

@deco_1
@deco_2
def now_1(a,b):
    print('now()1:a+b = ',a+b)

now_1(1,2)
로그인 후 복사

작업 결과:

# 结果,注意执行顺序:
------222222------
------111111------
start: this is deco_1.
start: this is deco_2.
now()1:a+b =  3
end: deco_2.
end: deco_1.
로그인 후 복사

7. 데코레이터 자체가 매개변수를 사용합니다.

데코레이팅된 함수에 매개변수를 사용하는 것 외에도 데코레이터 자체도 매개변수를 사용할 수 있습니다.

def logging(level):
    def wrapper(func):
        def inner_wrapper(*args, **kwargs):
            print("[{level}]: enter function {func}()".format(level=level, func=func.__name__))
            return func(*args, **kwargs)
        return inner_wrapper
    return wrapper
    
@logging(level='INFO')
def say(something):
    print("say {}!".format(something))

@logging(level='DEBUG')
def do(something):
    print("do {}...".format(something))

say('hello')
do("my work")
로그인 후 복사

실행 결과:

# 执行结果:
[INFO]: enter function say()
say hello!
[DEBUG]: enter function do()
do my work...
로그인 후 복사

관련 권장 사항:

파이썬의 데코레이터에 대한 자세한 설명

파이썬의 다양한 데코레이터에 대한 자세한 설명

위 내용은 Python의 데코레이터란 무엇입니까? Python의 데코레이터 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿