데코레이터
- 함수를 꾸며주는 장식자
- 기존 코드를 수정하지 않고도 기능을 추가할 수 있다.
def decorator(function):
def wrapper(): # 받은 함수를 실행
print('{} 함수 호출 요청'.format(function.__name__))
return function()
return wrapper
@decorator_function # 아래 함수를 function 인자로 넣어준다.
def abc():
print('abc 함수 실행 완료.')
@decorator_function # 아래 함수를 function 인자로 넣어준다.
def xyz():
print('xyz 함수 실행 완료.')
abc()
print
xyz()
# abc 함수 호출 요청
# abc 함수 실행 완료.
#
# xyz 함수 호출 요청
# xyz 함수 실행 완료.
이런식으로 decorator를 사용하면 기능을 간편하게 추가할 수 있다.
근데 만약 단순한 출력만이 아니라 인자가 필요한 함수를 추가한다면??
decorator -> wrapper -> 추가한 함수 순서대로 실행이 되는데
보다싶이 wrapper함수는 인자를 전달하지 않는다.
어떻게 해야할까?
def decorator(function):
def wrapper(*args, **kwargs): # 받은 함수를 실행
print('{} 함수 호출 요청'.format(function.__name__))
return function()
return wrapper
@decorator_function # 아래 함수를 function 인자로 넣어준다.
def abc():
print('abc 함수 실행 완료.')
@decorator_function # 아래 함수를 function 인자로 넣어준다.
def name_age():
print('name_age 함수 실행 완료. name={}, age={}'.format(name, age))
abc()
print
name_age('lee', 23)
# abc 함수 호출 요청
# abc 함수 실행 완료.
#
# name_age 함수 호출 요청
# name_age 함수 실행 완료. name=lee, age=23
그럼 인자를 전달하게 하면 된다.
단 전달할 만큼 미리 정해두는게 아니라(미리 정해두면 인수의 개수가 바뀔때마다 변경해줘야 한다;;)
*args, **kwargs를 사용한다.
*args
- arguments
- tuple 형태
- 받은 만큼 전달한다.
- 꼭 *args일 필요는 없다.(*abc도 기능한다. *이 핵심)
**kwargs
- keyword argument
- dictionary 형태 {'키워드':'밸류'}의 형태로 전달
더 자세한 내용은 아래 링크를 참고할 것.
http://schoolofweb.net/blog/posts/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0-decorator/
'파이썬 > 2. 파이썬 심화' 카테고리의 다른 글
파이썬 게으른 연산(lazy evaluation) (0) | 2020.04.27 |
---|---|
파이썬 클로저(closure) (0) | 2020.04.23 |
파이썬 람다 함수(lambda) (0) | 2020.04.23 |
파이썬 반복자와 생성자(Iterator, Generator) (0) | 2020.04.21 |
파이썬 함수 호출방식 (0) | 2020.04.13 |