python 으로 작성된 다른 코드들을 보다보면 아래와 같이 어느 함수 위에 @ 가 있는 걸 볼 수 있다. 이 @ 는 무엇을 나타내고 어떤 역할을 하지는 알아보자.
@decorator
def function1():
print("decorator")
decorator 란?
제목에서 알 수 있듯이 함수 위에 @로 붙혀져 있는 것이 바로decorator이다. 사실 데코레이터가 없다고 해서 구현을 못하는 일이 생기는 건 아니지만 코드가 복잡해진다. 즉 데코레이터를 사용하면 사용자가 편리해진다.
decorator 는 사실 하나의 함수이며, 다른 함수를 감싸고 있는 형태의 함수이다.
def decorator(func):
def deco_func():
print("decorator")
func()
return deco_func
def function1():
print("dhooonk")
function1 = decorator(function1)
function1()
# 결과:
# decorator
# dhooonk
기존의function1함수는 단순히 dhooonk 만을 출력하는 함수 이지만, 이 함수를 decorator 라는 함수에 씌어준 결과, 기존의 출력 이외에 decorator 라는 출력도 포함한다.
즉, 함수를 매개변수로 받고 그 안에 함수를 또 만들고 그 함수를 반환하게 된다. 생각보다 이러한 작업은 범용적으로 많이 쓰여, 이를 간결하게 하기 위해서 파이썬은decorator를 지원해준다.
def decorator(func):
def deco_func():
print("decorator")
func()
return deco_func
@decorator
def function1():
print("dhooonk")
function1()
# 결과:
# decorator
# dhooonk
다음과 같이@+ 감싸주는 함수이름을 함수 위에 적어줄 경우, 위와 같은 효과를 가져 올 수 있다. 이것이 바로 decorator이다.
복잡한 코드가 여러 함수에 중복적으로 들어가야할 경우decorator를 통해서 단순화 해 줄 수 있다.
인자를 가지는 decorator
이번에는 위의 코드를 조금 응용해서 각 함수마다 decorator를 출력하는 횟수가 달라야 한다고 가정하면, 장식자는 인자를 받아야 한다.
우선 장식자를 사용하지 않은 코드를 보면,
def decorator(n):
def outer(func):
def deco_func():
for i in range(n):
print("decorator")
func()
return deco_func
return outer
def function1():
print("dhooonk")
decorator_3 = decorator(3)
function1 = decorator_3(function1)
function1()
# 결과 :
# decorator
# decorator
# decorator
# dhooonk
기존decorator가 하던 함수를 받는 역할을outer가 대신 해주고 이번에는decorator는 n 값을 받아서 그 n 값 만큼 출력을 반복하는 새로운 함수를 반환하게된다. 이를 장식자로 사용하는 것도 똑같은 원리로 적용해주면 된다.
def decorator(n):
def outer(func):
def deco_func():
for i in range(n):
print("decorator")
func()
return deco_func
return outer
@decorator(3)
def function1():
print("dhooonk")
function1()
# 결과:
# decorator
# decorator
# decorator
# dhooonk
'DEVELOPMENT > django' 카테고리의 다른 글
[django] JWT 사용하기 (0) | 2020.11.28 |
---|---|
[django] restful-api 사용하기 (0) | 2020.11.28 |
[django] AWS S3와 연동하기 (0) | 2020.11.26 |
[django] seed 편하게만드는 방법, django_seed (0) | 2020.10.16 |
[django] 유저 다중모델 (0) | 2020.10.16 |