50 lines
2.4 KiB
Markdown
50 lines
2.4 KiB
Markdown
# 데코레이터
|
|
|
|
데코레이터는 파이썬에서 함수나 클래스에 추가적인 기능을 부여하는 강력한 도구입니다. 마치 함수나 클래스를 장식하듯이, 기존의 기능을 변경하거나 확장할 수 있죠.
|
|
|
|
데코레이터는 실제로 함수를 인자로 받아 새로운 함수를 반환하는, 고차 함수(higher-order function)입니다. 이렇게 반환된 새로운 함수는 원래 함수를 감싸면서 추가적인 작업을 수행할 수 있습니다.
|
|
|
|
```python
|
|
def my_decorator(func):
|
|
def wrapper(*args, **kwargs):
|
|
print("함수 실행 전")
|
|
result = func(*args, **kwargs)
|
|
print("함수 실행 후")
|
|
return result
|
|
return wrapper
|
|
|
|
@my_decorator
|
|
def greet(name):
|
|
print(f"Hello, {name}!")
|
|
|
|
greet("Alice")
|
|
```
|
|
위 예시에서 @my_decorator 부분이 greet 함수에 데코레이터를 적용하는 부분입니다. my_decorator 함수는 greet 함수를 인자로 받아 새로운 함수 wrapper를 반환합니다. 이 wrapper 함수는 greet 함수를 호출하기 전후에 추가적인 작업을 수행합니다.
|
|
|
|
## 활용
|
|
* 로깅: 함수의 실행 시간, 입력값, 출력값 등을 로그에 기록합니다.
|
|
* 캐싱: 함수의 결과를 캐시하여 동일한 입력에 대해 반복적인 계산을 방지합니다.
|
|
* 인증: 함수 호출 권한을 검사합니다.
|
|
* 예외 처리: 예외 발생 시 특정 작업을 수행합니다.
|
|
* 프로파일링: 함수의 성능을 측정합니다.
|
|
|
|
## 데코레이터의 구현
|
|
```python
|
|
def my_decorator(func):
|
|
def wrapper(*args, **kwargs):
|
|
# 데코레이터가 수행할 작업
|
|
# ...
|
|
result = func(*args, **kwargs)
|
|
# 데코레이터가 수행할 작업
|
|
return result
|
|
return wrapper
|
|
```
|
|
* @decorator_name 문법: 함수 위에 붙여 데코레이터를 적용합니다.
|
|
* wrapper 함수: 실제로 호출되는 함수입니다.
|
|
* *args, **kwargs: 가변 인자를 사용하여 다양한 형태의 함수에 적용할 수 있도록 합니다.
|
|
|
|
## 더 알아보기
|
|
* 클래스 데코레이터: 클래스에도 데코레이터를 적용할 수 있습니다.
|
|
* 매개변수가 있는 데코레이터: 데코레이터 함수에 인자를 전달하여 기능을 커스터마이징할 수 있습니다.
|
|
* 함수 데코레이터: 함수를 반환하는 함수를 사용하여 더 복잡한 기능을 구현할 수 있습니다.
|