중복코드를 묶어서 코드를 바꾸지 않고,
기능을 추가하거나 수정하고 싶을 때 쓰는 문법이
데코레이터 함수다.
(중복되는 코드1,코드 3을 묶어주고
남는 1, 4코드는 추가기능으로 만들어버림)
1. wrapper라는 inner function을 만들어줌.
2. 모든 아규먼트와 키워드 아규먼트 받을 수 있도록 파라미터를 설정
def wrapper(*arg, **kwargs)
3. code_1에서 func 실행
4. 그리고 return wrapper
1. def a() 함수가 wrapper로 바뀜.
def b() 함수도 wrapper로 바뀜.
2. @c를 쓰면 데코레이터 함수가 실행됨.
[순서]
1. @c를 쓰면 데코레이터 함수가 실행,
골뱅이 밑의 def a() 함수가
c(func)에 들어감.
2. c함수가 실행,
result=func(*args, **kwargs) 부분이
def_a()의 code_2를 실행
3. code2가 실행된 결과를 result 변수에 저장
4. return wrapper:
code 1,2,3을 실행한 result를
return해주는 함수가 선언됨.
5. def a()함수가 wrapper함수로 치환됨( 바뀜 )
def a()함수가 return 부분에서 wrapper 함수가 된 거임.
6. 데코레이터 부분에서
def a()함수 실행하면, wrapper함수가 실행되는 거나 다름없어짐.
---
그러니까 def c(func)은 def a()가 된 건데
code2를 실행해주는 부분은 result 파트인 것임.
요약: def c(func)이 def a()로 변경.
code 1,2,3이 실행된 result가
속한 함수는 wrapper.
★
이 wrapper함수가 마지막에 def a()로 바뀌면서
def a()실행시 위 코드가 작동함.
위 개념을 활용한 예제!
print를 제외하고 보면 코드구조가 더 심플해보인다.
a라는 함수가 있다고 쳐보자.
요건 b라는 함수.
이제 code1과 code3을 묶어주는
decolator function c를 만들어볼 것.
1. start와 result를 출력해주는 의미의 disp 함수를 생성해준다.
2. 그 밑에 wrapper함수로, code1과 code2 생성
3. 가운데에 code2와 code 4를 받을 수 있는 result를 생성.
#a,b
a와 b를 저런 식으로 출력하면,
start
result:3의 결과가 나와야한다.
#a
반면에 a만 그냥 쓰면
code 1,3이 실종된 상태로 출력되어버린다.
a,b에 각각 데코레이터 함수 c를
적용시킨 상태기 때문에..!
*
@disp를 불러오면 #a 함수만 불러와도
code 1,3이 적용된 상태로 소환이 가능하다.
(plus함수가 c의 wrapper함수로 바뀌기 때문에)
★ 1. @disp를 쓰면 해당 함수가
c의 decorator 설정으로 넘어가서,
wrapper함수로 변환된다.
2. plus 함수가 c의 disp(func)의 func에 들어간다.
(plus 함수 호출시 wrapper 함수 호출되는 거랑 똑같아짐)
3. wrapper함수가 선언되고, return 하면
plus함수가 wrapper 함수로 변환!
4. 그래서 plus를 실행하면 wrapper 안의 함수들이 실행.
*decorator 추가개념 소스들
https://bluese05.tistory.com/30
https://dojang.io/mod/page/view.php?id=2427
for i in range(a,b) 쓰는 법 및 알고리즘 작성 팁 _ 복습 1 (3.30) (0) | 2021.03.30 |
---|---|
파이썬패키지 정리 및 name is not defined 오류 (0) | 2021.01.11 |
파이썬 map, filter, reduce 개념정리 (0) | 2020.07.17 |
파이썬 inner,callback,lambda function (0) | 2020.07.17 |
파이썬 return과 args 및 kwargs개념 (0) | 2020.07.14 |
댓글 영역