[Python] 데코레이터 (Decorater)

손종일·2020년 8월 22일
0

Python

목록 보기
6/13
post-thumbnail

데코레이터 (Decorater)

데코레이터는 decorate의 '장식하다'에 er(or)이 붙은 말로서 장식하는 도구 정도로 생각할 수 있다.
데코레이터는 아래의 코드처럼 class 메소드를 만들 때, @staticmethod, @classmethod 등을 붙였는데 이렇게 @로 시작하는 것이 데코레이터이다.

class Calc:
	@staticmethod
	def add(a, b):
      print(a+b)

데코레이터의 사용 예시

아래의 코드에서 '안녕하세요, 반갑습니다'를 고정으로 출력하고 싶다면 함수를 생성할 때마다 출력해주어야해서 번거롭습니다. 이런 경우에 데코레이터를 사용하여 쉽게 출력할 수 있습니다.

데코레이터 사용 전,

def minsu():
    print("안녕하세요")
    print("민수님")
    print("반갑습니다")
-
def chulmin():
    print("안녕하세요")
    print("철민님")
    print("반갑습니다")
-
minsu()			// 안녕하세요
                           민수님
                           반갑습니다
chulmin()		// 안녕하세요
                           철민님
                           반갑습니다

데코레이터 사용 후

def trace(func):		#호출함 함수를 매개변수로 받는다.
	def wrapper():		#호출할 함수를 감싸는 함수이다.
    	print('안녕하세요')		
        func()			#매개변수로 받은 함수를 호출한다.
        print('반갑습니다')
    return wrapper()		#wrppaer 함수를 반환한다.
-
def minsu():
	print("민수님")
-
def chulmin():
	print("철민님")
-
trace_minsu=ment(minsu)		#데코레이터에 호출할 함수를 넣는다.
trace_minsu()     #함수 호출  // 안녕하세요
                               민수님
                               반갑습니다
trace_chulmin=ment(chulmin)
trace_chulmin()		    // 안녕하세요
                               철민님
                               반갑습니다

@으로 데코레이터 사용 후

def trace(func):		#호출함 함수를 매개변수로 받는다.
	def wrapper():		#호출할 함수를 감싸는 함수이다.
    	print('안녕하세요')		
        func()			#매개변수로 받은 함수를 호출한다.
        print('반갑습니다')
    return wrapper()		#wrppaer 함수를 반환한다.
-
@trace				#@데코레이터
def minsu():
	print("민수님")
-
@trace
def chulmin():
	print("철민님")
-
minsu()     #함수 호출        // 안녕하세요
                               민수님
                               반갑습니다
chulmin()		    // 안녕하세요
                               철민님
                               반갑습니다

인자를 받는 @데코레이터

def trace(name):
    def deco(func):
        def wrapper():
            return func() + name
        return wrapper
    return deco
-
@trace("Sohn")
def hello():
    return "안녕하세요 "
print(hello())		# 안녕하세요 Sohn

위의 @trace("Sohn")을 풀어쓰면 다음과 같다.

result = trace("Sohn")
main_result = result(hello)
print(main_result())
profile
Allday

0개의 댓글