python 장식기의 기본 사용
지식
기초 사용
간단한 장식기
def my_decorator(func):
def wrapper():
print('wrapper of decorator')
func()
return wrapper()
def test():
print('test done.')
test = my_decorator(test)
test
:
wrapper of decorator
test done.
이 코드에서 변수test는 내부 함수 wrapper () 를 가리키고 내부 함수 wrapper () 에서는 원 함수 test () 를 호출하기 때문에 마지막에 test () 를 호출할 때'wrapper of decorator'를 출력합니다.여기 함수 my_decorator () 는 진정으로 실행해야 할 함수test () 를 감싸고 행동을 바꾸는 장식기입니다. 그러나 원 함수test () 는 변하지 않습니다.
위의 코드는 Python에서 보다 간단하고 우아하게 표현됩니다.
def my_decorator(func):
def wrapper():
print('wrapper of decorator')
func()
return wrapper()
@my_decorator
def test():
print('test done.')
test
여기의 @, 우리는 문법당이라고 부른다, @my_decorator는 앞의 test=my_에 해당합니다decorator 문장만약 프로그램에 또 다른 함수가 유사한 장식을 필요로 한다면 @decorator를 추가하면 함수의 중복 이용과 프로그램 가독성을 높일 수 있다
파라미터가 있는 장식기
def args_decorator(func):
def wrapper(*args, **kwargs):
print('wrapper of decorator')
func(*args, **kwargs)
return wrapper
@args_decorator
def identity(name, message):
print('identity done.')
print(name, message)
identity('changhao', 'hello')
:
wrapper of decorator
identity done.
changhao hello
일반적으로 args와 *kwargs를 장식기 내부 함수 wrapper () 의 매개 변수로 사용합니다.임의의 수량과 유형을 수용하는 매개 변수를 나타낸다사용자 정의 매개 변수가 있는 장식기
장식기 내부 함수가 실행되는 횟수를 나타내는 매개변수를 정의합니다.
def repeat(num):
def my_decorator(func):
def wrapper(*args, **kwargs):
for i in range(num):
func(*args, **kwargs)
return wrapper
return my_decorator
@repeat(3)
def showname(message):
print(message)
showname('changhao')
:
changhao
changhao
changhao
클래스 장식기
클래스도 장식기로 사용할 수 있습니다. 클래스 장식기는 주로 함수 __에 의존합니다call__예제를 호출할 때마다 함수 __call__() 한 번 실행됩니다.
class Count:
def __init__(self, func):
self.func = func
self.num_calls = 0
def __call__(self, *args, **kwargs):
self.num_calls += 1
print('num of calls is: {}'.format(self.num_calls))
return self.func(*args, **kwargs)
@Count
def example():
print('example done.')
example()
example()
:
num of calls is: 1
example done.
num of calls is: 2
example done.
클래스 Count를 정의합니다. 초기화할 때 원래 함수 func()가 전달되고 __call__() 함수는 변수num_calls는 1을 추가한 후에 인쇄하고 원 함수를 호출합니다.그래서 우리가 함수 example () 를 처음 호출했을 때num_calls의 값은 1이고, 처음 호출했을 때, 값은 2로 바뀌었다.장식기의 끼워 넣기
import functools
def my_decorator1(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print('execute decorator1')
func(*args, **kwargs)
return wrapper
def my_decorator2(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print('execute decorator2')
func(*args, **kwargs)
return wrapper
@my_decorator1
@my_decorator2
def test2(message):
print(message)
test2('changhao')
:
execute decorator1
execute decorator2
changhao
클래스 장식기
클래스도 장식기로 사용할 수 있습니다. 클래스 장식기는 주로 함수 __에 의존합니다call__예제를 호출할 때마다 함수 __call__() 한 번 실행됩니다.
class Count:
def __init__(self, func):
self.func = func
self.num_calls = 0
def __call__(self, *args, **kwargs):
self.num_calls += 1
print('num of calls is: {}'.format(self.num_calls))
return self.func(*args, **kwargs)
@Count
def example():
print('example done.')
example()
example()
:
num of calls is: 1
example done.
num of calls is: 2
example done.
클래스 Count를 정의합니다. 초기화할 때 원래 함수 func()가 전달되고 __call__() 함수는 변수num_calls는 1을 추가한 후에 인쇄하고 원 함수를 호출합니다.그래서 우리가 함수 example () 를 처음 호출했을 때num_calls의 값은 1이고, 처음 호출했을 때, 값은 2로 바뀌었다.장식기의 끼워 넣기
import functools
def my_decorator1(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print('execute decorator1')
func(*args, **kwargs)
return wrapper
def my_decorator2(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print('execute decorator2')
func(*args, **kwargs)
return wrapper
@my_decorator1
@my_decorator2
def test2(message):
print(message)
test2('changhao')
:
execute decorator1
execute decorator2
changhao
@functools.랩 장식기 사용
import functools
def my_decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print('wrapper of decorator')
func(*args, **kwargs)
return wrapper
@my_decorator
def test3(message):
print(message)
test3.__name__
test3
보통 내장된 장식기 @functools를 사용합니다.랩, 그는 원 함수의 원 정보를 보존할 것이다 (즉, 원 함수의 원 정보를 대응하는 장식기에 복사하는 것이다)장식기 용법 실례
인증
import functools
def authenticate(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
request = args[0]
if check_user_logged_in(request):
return func(*args, **kwargs)
else:
raise Exception('Authentication failed')
return wrapper
@authenticate
def post_comment(request):
pass
이 코드에서 장식기authenticate를 정의했습니다.반면 함수post_comment () 는 사용자가 어떤 글에 대한 평론을 발표하는 것을 나타낸다.매번 이 함수를 호출하기 전에 사용자가 로그인 상태인지 확인하고 로그인 상태라면 이 동작을 허용합니다.로그인하지 않으면 허용되지 않습니다.로깅
import time
import functools
def log_execution_time(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start = time.perf_counter()
res = func(*args, **kwargs)
end = time.perf_counter()
print('{} took {} ms'.format(func.__name__, (end - start) * 1000))
return wrapper
@log_execution_time
def calculate_similarity(times):
pass
여기 장식기 log_execution_time는 함수의 운행 시간을 기록하고 실행 결과를 되돌려줍니다.만약 당신이 어떤 함수의 실행 시간을 계산하고 싶다면, 이 함수 위에 @log_execution_타임이면 돼요.총결산
이른바 장식기란 사실 장식기 함수를 통해 원함수의 일부 기능을 수정하여 원함수를 수정할 필요가 없게 하는 것이다.
이상은python 장식기의 기본적인 사용에 대한 상세한 내용입니다. 더 많은python 장식기에 대한 자료는 저희 다른 관련 글에 주목하세요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.