📚 Chapter 7-7. 함수 데코레이터
🔥 1. 데코레이터란?
- **데코레이터(Decorator)**는 @ 기호로 시작하며, 함수나 클래스에 추가 기능을 부여할 때 사용됩니다.
- 함수 데코레이터와 클래스 데코레이터로 나눌 수 있습니다.
💡 데코레이터의 주요 기능
- 함수 호출 전후에 공통된 작업을 수행할 수 있습니다.
- 코드의 중복을 줄이고, 유지보수를 용이하게 합니다.
- 로깅, 성능 측정, 유효성 검사 등 다양한 용도로 활용됩니다.
✨ 2. 함수 데코레이터 사용 방법
함수에 데코레이터를 적용하면, 반복되는 작업을 깔끔하게 처리할 수 있습니다.
✅ 기본 예제
def test(function):
def wrapper():
# 함수 호출 전 추가 작업
print("✅ 허언증이 재발했습니다.")
# 원래 함수 호출
function()
# 함수 호출 후 추가 작업
print("✅ 격리 되었습니다.")
return wrapper
# oz 함수를 데코레이터로 감쌈
@test
def oz():
print("🔥 파이썬 진짜 재미있엉 하하")
# 함수 호출
oz()
✅ 출력 결과
✅ 허언증이 재발했습니다.
🔥 파이썬 진짜 재미있엉 하하
✅ 격리 되었습니다.
⚡ 설명
- @test로 oz() 함수에 test 데코레이터를 적용합니다.
- wrapper() 함수에서 함수 호출 전후로 공통된 작업을 추가했습니다.
🌟 포스트 - 데코레이터와 컬백 함수 설명
✅ 1. 코드 구조 분석
def test(function):
def wrapper():
print(누나의 허어르진이 재발했습니다.)
function() # ⭐️ 컬백 함수로 호출되는 부분
print(경림되었습니다.)
return wrapper
@test
def oz():
print(파이썬 진정 재미있어요 하하)
oz()
✅ 2. 프로세스별 동작 휘두른 방식
📌 Step 1: 데코레이터 정의
- test 함수는 데코레이터입니다.
- function은 인자로 전달되는 타겟 함수(oz 함수)를 의미.
- wrapper는 실제 실행될 함수로, 타겟 함수를 감사해서 추가 동작을 수행합니다.
📌 Step 2: @test로 데코레이터 적용
@test
def oz():
print(파이썬 진정 재미있어요 하하)
- @test는 **oz = test(oz)**로 해석됩니다.
- oz 함수가 test 함수의 인자로 전달되고, test는 wrapper를 반환합니다.
- 계속적으로 oz()는 wrapper()를 호출하는 형태가 됩니다.
📌 Step 3: oz() 함수 호출 시 실행 휘두른
- oz() 호출 → 실제로는 wrapper()가 호출됨.
- wrapper() 함수 실행:
- "허어르진이 재발했습니다." 출력
- function() 실행 → oz() 함수가 컬백으로 실행
- "파이썬 진정 재미있어요 하하" 출력
- "경림되었습니다." 출력
✅ 3. 출력 결과
허어르진이 재발했습니다.
파이썬 진정 재미있어요 하하
경림되었습니다.
✅ 4. 컬백 함수가 적용된 이유
- 컬백 함수라는 것은? → 다른 함수에 인자로 전달되어, 특정 시점에 호출되는 함수를 말합니다.
- test(function)에서 function은 oz 함수가 전달됩니다.
- wrapper() 함수 내
🚀 3. 데코레이터 심화 사용법
✅ 매개변수가 있는 함수에 데코레이터 사용
def logger(function):
def wrapper(*args, **kwargs):
print(f"📂 함수 '{function.__name__}' 호출")
return function(*args, **kwargs)
return wrapper
@logger
def add(a, b):
return a + b
print(add(3, 5))
✅ 출력 결과
📂 함수 'add' 호출
8
⚡ 설명
- *args, **kwargs를 통해 모든 형태의 인자를 받을 수 있습니다.
- function.__name__은 함수의 이름을 가져옵니다.
✅ 여러 개의 데코레이터 사용하기
def bold(function):
def wrapper():
return "<b>" + function() + "</b>"
return wrapper
def italic(function):
def wrapper():
return "<i>" + function() + "</i>"
return wrapper
@bold
@italic
def text():
return "Python"
print(text())
✅ 출력 결과
<b><i>Python</i></b>
⚡ 설명
- @italic이 먼저 실행되고, 이후 @bold가 적용됩니다.
🧐 4. 데코레이터 사용 시 주의점
- **functools.wraps**를 사용하여 원래 함수의 메타 정보를 유지하도록 합니다.
from functools import wraps
def decorator(function):
@wraps(function)
def wrapper(*args, **kwargs):
print("함수 호출 전")
return function(*args, **kwargs)
return wrapper
@decorator
def hello():
"""인사 함수"""
print("안녕하세요!")
print(hello.__name__) # 'hello' 출력
print(hello.__doc__) # '인사 함수' 출력
⚡ **functools.wraps**는 데코레이터가 적용된 함수가 원래 함수의 이름과 docstring을 유지하게 해줍니다.
✅ 5. 데코레이터의 사용 목적
- ✔️ 중복 코드 제거: 여러 함수에서 동일한 작업을 할 때 공통 코드로 관리할 수 있습니다.
- ✔️ 유효성 검사: 인자의 유효성을 데코레이터로 처리할 수 있습니다.
- ✔️ 로깅(Log): 함수 호출 이력을 자동으로 기록할 수 있습니다.
- ✔️ 성능 측정: 함수 실행 시간을 측정해 효율성을 확인할 수 있습니다.
📝 6. 이해도 체크리스트
- 다음 중 함수 데코레이터에 대한 설명으로 옳지 않은 것은?
- a) 함수 호출 전후로 공통된 작업을 쉽게 추가할 수 있다.
b) @ 기호를 사용하여 적용한다.
c) 함수를 인자로 전달하고, 수정된 함수를 반환한다.
d) 함수 데코레이터는 클래스에서만 사용할 수 있다.
- ✅ 정답: d
- 함수 데코레이터는 함수뿐 아니라 클래스에도 적용할 수 있습니다.
- 다음 중 함수 데코레이터를 사용하는 이유로 적절하지 않은 것은?
- a) 함수 호출 전후로 공통된 작업을 수행하기 위해
b) 함수의 이름을 변경하기 위해
c) 함수의 성능을 측정하기 위해
d) 함수 호출을 로깅하기 위해
- ✅ 정답: b
- 함수 데코레이터는 동작을 확장하거나 수정하는 데 사용되며, 함수 이름을 변경하려면 다른 방법을 사용해야 합니다.
⚠️ 해당 체크리스트는 본 챕터의 이해도를 확인하기 위한 것입니다. 대답에 어려움이 있다면, 다시 한번 강의를 복습해보세요! 😉
'Python' 카테고리의 다른 글
PYTHON - 예외처리와 모듈 (Chapter 7-41. 패키지) (0) | 2025.03.14 |
---|---|
PYTHON - 예외처리와 모듈 (Chapter 7-40. 모듈 만들기) (0) | 2025.03.14 |
PYTHON - 예외처리와 모듈 (Chapter 7-38. 외부모듈) (0) | 2025.03.14 |
PYTHON - 예외처리와 모듈 (Chapter 7-37. 표준모듈) (0) | 2025.03.14 |
PYTHON - 예외처리와 모듈 (Chapter 7-36. raise 구문) (0) | 2025.03.14 |