728x90
반응형
https://devbruce.github.io/python/py-17-decorator/
위 사이트에 Decorator의 설명가 예제가 잘 되어있어
사이트에 있는 예제를 기반으로 공부하고 내가 추가로 함수를 만들어 보며 Decorator에 대해 알아보았다!
Decorator란
- 어떤 함수를 받아 명령을 추가한 뒤 이를 다시 함수의 형태로 반환하는 함수.
- 어떤 함수의 내부를 수정하지 않고 기능에 변화를 주고 싶을 때 사용한다.
- 함수를 꾸며준다.
자바의 Closure와 비슷하다.
Decorator의 구조
def 데코레이터이름(func): # 기능을 추가할 함수를 인자로 받아온다.
def 내부함수이름(*args, **kwargs):
기존 함수에 추가할 명령
return func(*args, **kwargs)
return 내부함수이름
사이트에 있는 예제로 Decorator에 대해 이해해 보았다.
def test(a,b):
print("계산 시작합니다.")
print(a+b)
print("계산 완료되었습니다.")
def test2(a,b):
print("계산 시작합니다.")
print(a*b)
print("계산 완료되었습니다.")
def test3(a,b):
print("계산 시작합니다.")
print(a//b)
print("계산 완료되었습니다.")
print문이 매우 노가다이므로 이걸 Decorator를 사용한다!
def deco_func(origin_func):
def nested_func(*args, **kwargs):
print("계산 시작합니다.")
origin_func(*args,**kwargs) #여기 내부함수 nested_func 함수에서 origin_func
print("계산 완료되었습니다.")
return
return nested_func
- 구조를 이해하기 위해서는 Closure 에 대해 알아야 하는데
클로저의 3가지 조건
1. 외부함수에서 내부함수를 반환
2. 함수가 중첩(외부함수 내부함수가 있어야한다)
3. 내부함수에서 외부함수의 지역변수를 참조하고 있어야 한다.
배우다 보니 스프링의 AOP 기능과 비슷하다고 느꼈다.
@deco_func
def test(a,b):
print(a+b)
@deco_func
def test2(a,b):
print(a*b)
@deco_func
def test3(a,b):
print(a//b)
Decorator한 함수를 실행시켜 보니
test(5,2)
print("-"*30)
test2(5,2)
print("-"*30)
test3(5,2)
신기하다.
def new_func(a,b,c,d,e):
print(a,b,c,d,e)
데코레이터가 적용되는 과정은 결국 클로저 활용과 동일하다.
deco_func(new_func)(1,2,3,100,200)
def a(**u):
for i in u:
print(i)
a(t=6, q=8) #키와 벨류로 전달
728x90
반응형
'Language > Python' 카테고리의 다른 글
[Python/파이썬] matplotlib 활용 / random 문제 (0) | 2021.06.09 |
---|---|
[Python/파이썬] 람다함수(lambda function) (0) | 2021.06.02 |
[Python/파이썬] 클래스와 특수 메소드 (0) | 2021.06.02 |
[Python/파이썬] 객체의 동일성(identity) (0) | 2021.06.02 |
[Python/파이썬] 클래스(class), 객체(object), 생성자, 메서드 만들기 (0) | 2021.06.02 |