python

Python 기초! decorator이란? (파이썬 데코레이터)

Jueun7 2023. 9. 1. 19:56

데코레이터가 필요해ㅠㅠ

는 말 그대로 함수를 데코레이팅 해주는 역할을 한다.

 

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

역시말랑말랑파이썬