이 기사에서는 Python의 데코레이터가 무엇인지 소개합니다. Python의 데코레이터 도입은 참고할만한 가치가 있습니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
데코레이터는 본질적으로 다른 함수가 코드를 변경하지 않고도 추가 기능을 추가할 수 있도록 하는 Python 함수입니다.
데코레이터는 핵심 코드를 수정하지 않고도 핵심 코드 부분의 기능을 향상시킵니다. 예를 들어 기능 앞에 로그, 권한 확인, 트랜잭션 처리 및 기타 시나리오를 삽입합니다.
그리고 함수함수와 전혀 관련이 없는 유사한 코드를 대량으로 추출하여 재사용할 수도 있습니다.
파이썬의 함수도 객체로 간주할 수 있으며, 변수에 할당할 수 있고 변수를 통해 함수를 호출할 수 있습니다.
예:
def foo(): print("2017-06-08") f = foo # 将函数赋值给变量,f为函数对象 f() # 返回结果: 2017-06-08
이제 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() 자체를 호출합니다.
데코레이터가 반환한 함수가 호출되면 매개변수가 래핑 함수로 전달됩니다. 매개변수를 데코레이팅된 함수에 전달합니다.
는 다음과 같습니다.
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
데코레이터를 호출해야 하는 함수가 여러 개 있는데, 함수의 매개변수가 서로 다른 경우, 어떻게 해야 할까요? 구현해? 하나의 데코레이터에 해당하는 하나의 함수가 있을 수 없습니다. 이때 가변 매개변수를 갖는 데코레이터를 이용하여 구현할 수 있다.
다음과 같습니다.
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)
실행해 보세요~
한 함수에 여러 함수를 추가하고 싶을 때 다중 레이어 데코레이터 사용을 고려해 볼 수 있지만, 데코레이터의 실행 순서에 주의해야 합니다. .
예:
# 注意代码的执行顺序 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.
데코레이팅된 함수에 매개변수를 사용하는 것 외에도 데코레이터 자체도 매개변수를 사용할 수 있습니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!