# 장점
# 1. 중복 제거, 코드 간결, 공통 함수 작성
# 2. 로깅, 프레임워크, 유효성 체크..... -> 공통 기능
# 3. 조합해서 사용 용이
중점으로 볼점들
1. 데코레이터 쓰는 이유
2. 데코레이터 동작방식
3. 데코레이터 쓰는 형식
4. 데코레이터는 다른사람이 만든 소스코드를 이용해서 사용하기는 쉽다.
1. 데코레이터 쓰는 이유
유효성체크가 가장 큰거 같다. 데코레이터를 쓴다는 가독성이 있다. 왜냐면 데코레이터를 쓰는 목적의 범위가 있으니까
가장큰 ex가 밑에 예제다. 함수를 쓸 때 함수정보들을 바로바로 확인이 되니까
2. 데코레이터 동작방식
데코레이터 함수가 명시된 time_func함수가 있다고 가정하면
time_func() 함수 사용후 데코레이터 함수도 실행이 된다.
3. 데코레이터 쓰는 형식
Closure 쓰는 형식 + 알파
-------(4). 데코레이터를 쓸 함수 위에 "@perf_clock" 이라는 데코레이터 함수를 명시적을 적어주면 됨.
그러면 그 함수 실행시 데코레이터 함수도 ON!!
4. 데코레이터는 다른사람이 만든 소스코드를 이용해서 사용하기는 쉽다.
ㅇㅇ
코드
코드설명 :
def time_func(seconds): 와 def sum_func(*numbers): 함수를 실행할 때 마다
1.시작시간 2.종료시간 3.함수명 4.함수매개변수 5.리턴값
에 대한 내용을 데코레이터함수로 알려주는 코드다.
# Chapter05-04
# 파이썬 심화
# 데코레이터
# 장점
# 1. 중복 제거, 코드 간결, 공통 함수 작성
# 2. 로깅, 프레임워크, 유효성 체크..... -> 공통 기능
# 3. 조합해서 사용 용이
# 단점
# 1. 가독성 감소?
# 2. 특정 기능에 한정된 함수는 -> 단일 함수로 작성하는 것이 유리
# 3. 디버깅 불편
# 데코레이터 실습
import time
def perf_clock(func):
def perf_clocked(*args):
# 함수 시작 시간
st = time.perf_counter()
result = func(*args)
# 함수 종료 시간 계산
et = time.perf_counter() - st
# 실행 함수명
name = func.__name__
# 함수 매개변수
arg_str = ', '.join(repr(arg) for arg in args)
# 결과 출력
print('[%0.5fs] %s(%s) -> %r' % (et, name, arg_str, result))
return result
return perf_clocked
@perf_clock
def time_func(seconds):
time.sleep(seconds)
@perf_clock
def sum_func(*numbers):
return sum(numbers)
# 데코레이터 미사용
none_deco1 = perf_clock(time_func)
none_deco2 = perf_clock(sum_func)
print(none_deco1, none_deco1.__code__.co_freevars)
print(none_deco2, none_deco2.__code__.co_freevars)
print('-' * 40, 'Called None Decorator -> time_func')
print()
none_deco1(1.5)
print('-' * 40, 'Called None Decorator -> sum_func')
print()
none_deco2(100, 150, 250, 300, 350)
print()
print()
# 데코레이터 사용
print('*' * 40, 'Called Decorator -> time_func')
print()
time_func(1.5)
print('*' * 40, 'Called Decorator -> sum_func')
print()
sum_func(100, 150, 250, 300, 350)
print()
'C++,python (인프런+사이트) > python 파이썬 정리' 카테고리의 다른 글
코루틴 메인--->서브 보내는법 (0) | 2022.04.04 |
---|---|
Generator 제너레이터 ( Yield ) (0) | 2022.04.04 |
Closure 클로저 (0) | 2022.04.03 |
Class로 구현하는 클로저 기능 (0) | 2022.04.03 |
람다 맵 리듀스 필터 (0) | 2022.04.02 |
댓글