python의 길 - 장식기 보충 (wraps 응용 프로그램)
1960 단어 함수편
프로그램자에 대해 말하자면 개방-폐쇄의 원칙을 따르는 전제에서 피장식 대상에 새로운 기능을 추가하기 위한 것이다
사용자에게 있어서 표면적으로 보면 사용 방식은 이전과 변하지 않았다
import time
def timer(func):
def wrapper(*args,**kwargs):
start_time = time.time()
res=func(*args,**kwargs)
end_time = time.time()
print(end_time - start_time)
return res
return wrapper
@timer
def login():
time.sleep(1)
'''
...
:return:
'''
print(' !')
login()
상소 장식기에 대해 로그인 함수를 위한 운행 시간 통계 기능을 추가하였으며, 사용자에게 있어서는login()을 호출하여 이 기능을 촉발하였으나
이 함수의 속성을 볼 때name__,및doc__예를 들면 다음과 같습니다.
print(login.__name__)
print(login.__doc__)
# :--->
#wrapper
#None
프로그램 논리로 볼 때 이렇습니다. 현재 이 변수 이름login은 wrapper 함수의 메모리 주소를 가리키고 있습니다.
그러면 우리는 wapper 함수에 원login 함수와 같은 속성을 추가하면 된다. 예를 들어 다음과 같다.
import time
def timer(func):
def wrapper(*args,**kwargs):
start_time = time.time()
res=func(*args,**kwargs)
end_time = time.time()
print(end_time - start_time)
return res
wrapper.__name__ = func.__name__
wrapper.__doc__ = func.__doc__
return wrapper
@timer
def login():
'''
sadad
:return:
'''
time.sleep(1)
print(' !')
login()
print(login.__name__)
print(login.__doc__)
wraps는 모든 교체를 도와줍니다.
import time
from functools import wraps
def timer(func):
@wraps(func)
def wrapper(*args,**kwargs):
start_time = time.time()
res=func(*args,**kwargs)
end_time = time.time()
print(end_time - start_time)
return res
return wrapper
@timer
def login():
'''
sadad
:return:
'''
time.sleep(1)
print(' !')
login()
print(login.__name__)
print(login.__doc__)