Python 기초! decorator이란? (파이썬 데코레이터)
데코레이터가 필요해ㅠㅠ
는 말 그대로 함수를 데코레이팅 해주는 역할을 한다.
def what_my_name():
print("what's my name?")
이런 간단한 함수 하나가 있다.
근데 코딩을 하다 보니까 이 함수에 추가 기능이 필요했다.
저 질문을 하기 전에 몇 마디를 더 출력하고 싶어진 것이다.
def what_my_name():
print("what's my name?")
print("Do you know?")
what_my_name()
흠 완벽하다.
어? 그런데 코딩을 또 하다 보니 새로운 함수가 생기고 여러 번 출력을 해야 한다.
def what_my_name():
print("what's my name?")
def my_name_is():
print("누구게?")
my_name_is()
print("Do you know?")
what_my_name()
what_my_name()
print("Do you know?")
my_name_is()
흠... 완벽하긴 한데 너무 귀찮고 복잡하다.
중간중간 print 문이 섞여서 함수를 더 만들기도 힘들 것 같다...
이럴 때 데코레이터를 사용한다.
그래서 데코레이터는?
데코레이터 함수는 특이하다. 함수의 파라미터로 함수를 받는다..!
하나의 예시를 들어보겠다.
def p_name(origin):
def wrapper():
print("do you know?")
origin()
return wrapper
이런 식으로 데코레이터 함수의 파라미터에 함수를 받는다.
p_name 함수는 파라미터 origin으로 함수를 받는다.
함수가 실행되면 return wrapper이 실행되고 p_name() 함수 안에서 wrapper를 return 한다.
wrapper() 함수에서는 print()를 하고, p_name() 함수로 받았던 origin을 호출한다.
이런 원리이다.
def what_my_name():
print("what's my name?")
def my_name_is():
print("누구게?")
def p_name(origin):
def wrapper():
print("do you know?")
origin()
return wrapper
p_name(what_my_name)
한번 이런 식으로 만들고 실행해보면, 당연히 실행이 안된다.
return wrapper, 즉 wrapper를 return 하는 역할이다. 즉 함수를 리턴만 해 주는 것이다.
그럼 그 함수를 실행하려면,
p_name(what_my_name)()
이런식으로 호출을 해 주어야 한다.
다시 실행해보면,
do you know?
what's my name?
이런식으로 잘 출력되는 것을 볼 수 있다.
하지만 아직 귀찮다. 더 간단히 호출할 것이다.
p_name(what_my_name)()
# 이렇게 함수를 호출했다면,
print_name = p_name(what_my_name)
# 이런식으로 바꿔줄 수 있다.
# 다시 함수를 호출하려면 이렇게 사용하면 된다.
print_name()
와 진짜 간단하게 사용하게 되었다!!! 11
def what_my_name():
print("what's my name?")
def my_name_is():
print("누구게?")
def p_name(origin):
def wrapper():
print("do you know?")
origin()
return wrapper
print_name1 = p_name(what_my_name)
print_name2 = p_name(my_name_is)
print_name1
print_name2
이런 식으로 간략화할 수 있다
하지만 아직도 부족하다.
그래서
더 간략화 할 수 있다!!!
def p_name(origin):
def wrapper():
print("do you know?")
origin()
return wrapper
@p_name
def what_my_name():
print("what's my name?")
@p_name
def my_name_is():
print("누구게?")
my_name_is()
what_my_name()
데코레이터 함수를 위에서 선언하고
@ 키워드로 데코레이션을 해주면,
do you know?
누구게?
do you know?
what's my name?
이런식으로 데코레이션이 잘 되어서 나오는 것을 볼 수 있다!!
파이썬의 강력함!
review
역시말랑말랑파이썬