파이썬의 강력하고 유용한 기능 중 하나인 데코레이터(Decorator)에 대해 알아보겠습니다. 데코레이터를 사용하면 코드를 더 깔끔하고 재사용 가능하게 만들 수 있습니다. 함께 살펴볼까요?
데코레이터란?
데코레이터는 기존 함수나 클래스의 동작을 수정하거나 확장할 수 있게 해주는 파이썬의 강력한 도구입니다. 간단히 말해, 다른 함수를 감싸고 있는 함수라고 생각하면 됩니다.
기본 데코레이터 만들기
가장 간단한 형태의 데코레이터를 만들어 봅시다.
def simple_decorator(func):
def wrapper():
print("함수 실행 전")
func()
print("함수 실행 후")
return wrapper
@simple_decorator
def say_hello():
print("안녕하세요!")
say_hello()
이 코드를 실행하면 다음과 같은 결과가 나옵니다:
@simple_decorator는 say_hello 함수를 simple_decorator 함수로 감싸라는 의미입니다.
인자를 받는 함수에 데코레이터 적용하기
실제로는 대부분의 함수가 인자를 받습니다. 이런 함수에도 데코레이터를 적용할 수 있습니다.
def logging_decorator(func):
def wrapper(*args, **kwargs):
print(f"{func.__name__} 함수 호출. 인자: {args}, {kwargs}")
return func(*args, **kwargs)
return wrapper
@logging_decorator
def add(a, b):
return a + b
result = add(3, 5)
print(f"결과: {result}")
실행 결과:
add 함수 호출. 인자: (3, 5), {}
결과: 8
데코레이터에 인자 전달하기
데코레이터 자체에 인자를 전달할 수도 있습니다.
def repeat(times):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(times):
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@repeat(3)
def greet(name):
print(f"안녕하세요, {name}님!")
greet("철수")
실행 결과:
안녕하세요, 철수님!
안녕하세요, 철수님!
안녕하세요, 철수님!
클래스 데코레이터
함수뿐만 아니라 클래스에도 데코레이터를 적용할 수 있습니다.
def singleton(cls):
instances = {}
def get_instance(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return get_instance
@singleton
class Database:
def __init__(self):
print("데이터베이스 연결")
# 여러 번 인스턴스를 생성해도 같은 객체를 반환합니다.
db1 = Database()
db2 = Database()
print(db1 is db2) # True
데코레이터의 실제 사용 사례
- 로깅
- 성능 측정
- 접근 제어 및 인증
- 캐싱
- 에러 처리
마치며
데코레이터는 파이썬의 강력한 기능 중 하나로, 코드의 재사용성과 가독성을 높여줍니다. 적절히 사용하면 코드를 더욱 우아하고 효율적으로 만들 수 있습니다.
하지만 과도한 사용은 오히려 코드를 복잡하게 만들 수 있으니 주의해야 합니다. 데코레이터의 동작 원리를 잘 이해하고, 필요한 상황에 적절히 사용하는 것이 중요합니다.
여러분의 코드에 데코레이터를 적용해 보세요. 더 나은 코드 구조와 함께 파이썬의 우아함을 경험하실 수 있을 거예요!