데코레이터는 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())