데코레이터란
파이썬 데코레이터의 정의를 찾아보면 다음과 같다
기존함수를 입력 받아서 기능이 추가된 새로운 함수 객체로 만들어 주는 역할을 수행한다.
기능이 추가된 새로운 함수객체? 잘 이해가 되지 않으니 코드로 이해보면 좋다.
코드로 이해하기
def 재관():
print("안녕하세요. 저는 재관이에요.")
def 지수():
print("안녕하세요. 저는 지수에요.")
def 민지():
print("안녕하세요. 저는 민지에요.")
def 정우():
print("안녕하세요. 저는 정우에요.")
def 동훈():
print("안녕하세요. 저는 동훈이에요.")
위와 같이 5개의 함수가 정의되어있는 상황에서, 갑자기 각 함수별로 성별까지 추가로 print가 되게 코드를 수정해야 된다면, 데코레이터 없이 아래와 같이 수정이 가능하다.
방법1. 하나씩 기능 추가해보기
def 재관():
print("안녕하세요. 저는 재관이에요.")
print("저는 남성입니다".)
def 지수():
print("안녕하세요. 저는 지수에요.")
print("저는 여성입니다.")
def 민지():
print("안녕하세요. 저는 민지에요.")
print("저는 여성입니다.")
def 정우():
print("안녕하세요. 저는 정우에요.")
print("저는 남성입니다.")
def 동훈():
print("안녕하세요. 저는 동훈이에요.")
print("저는 남성입니다.")
하지만 위와 같이 수정해야 되는 상황에서 사람이 1000명이나 된다면, 또는 수정해야 되는 코드가 길다면 수작업으로 진행하기 쉽지 않다.
어떻게 해야 될까?
방법2 : 함수 재정의
def 남성(fn):
def 새로운함수():
fn()
print("저는 남성입니다.")
return 새로운함수
def 여성(fn):
def 새로운함수():
fn()
print("저는 여성입니다.")
return 새로운함수
# 함수 재정의
재관 = 남성(재관())
지수 = 여성(지수())
민지 = 여성(민지())
정우 = 남성(정우())
동훈 = 남성(동훈())
재관, 정우, 동훈과 같이 남성객체는 남성( )이라는 함수를 통해 새롭게 재정의 할 수 있으며 민지, 지수도 여성( )함수를 통해 새로운 함수 객체를 생성 할 수 있다.
방법3 : 데코레이터를 활용해 정의하기
@남성
def 재관():
print("안녕하세요. 저는 재관이에요.")
@여성
def 지수():
print("안녕하세요. 저는 지수에요.")
@여성
def 민지():
print("안녕하세요. 저는 민지에요.")
@남성
def 정우():
print("안녕하세요. 저는 정우에요.")
@남성
def 동훈():
print("안녕하세요. 저는 동훈이에요.")
이와 같이 데코레이터 문법을 작성하면 앞서 방법2의 단계와 동일한 결과를 가지게 된다.