PHpullh
학습 라이브러리/Python/클래스 데코레이터

PYTHON · 객체지향

클래스 데코레이터

클래스에 데코레이터를 적용하여 메서드 추가, 유효성 검사, 싱글톤 등 횡단 관심사를 처리합니다.

객체지향중급class decorator클래스 데코레이터frozenauto_repr

핵심 설명

클래스에 데코레이터를 적용하여 메서드 추가, 유효성 검사, 싱글톤 등 횡단 관심사를 처리합니다.

Python code

import functools
from typing import Any

# 자동 repr 추가 데코레이터
def auto_repr(cls):
    def __repr__(self):
        attrs = ", ".join(f"{k}={v!r}" for k, v in vars(self).items())
        return f"{cls.__name__}({attrs})"
    cls.__repr__ = __repr__
    return cls

# 불변 클래스 데코레이터
def frozen(cls):
    original_init = cls.__init__
    @functools.wraps(original_init)
    def new_init(self, *args, **kwargs):
        original_init(self, *args, **kwargs)
        object.__setattr__(self, '_frozen', True)
    def __setattr__(self, name, value):
        if getattr(self, '_frozen', False):
            raise AttributeError(f"{cls.__name__}는 불변입니다")
        object.__setattr__(self, name, value)
    cls.__init__ = new_init
    cls.__setattr__ = __setattr__
    return cls

@auto_repr
@frozen
class Point:
    def __init__(self, x: float, y: float):
        self.x = x
        self.y = y

p = Point(3, 4)
print(p)  # Point(x=3, y=4)
# p.x = 5  # AttributeError: Point는 불변입니다

학습 팁

Python 3.10+의 @dataclass(frozen=True)로 불변 클래스를 더 쉽게 만들 수 있습니다.

주의할 점

클래스 데코레이터에서 원본 클래스를 반환하지 않으면 클래스가 None으로 대체됩니다.

자주 묻는 질문

클래스 데코레이터란 무엇인가요?

클래스에 데코레이터를 적용하여 메서드 추가, 유효성 검사, 싱글톤 등 횡단 관심사를 처리합니다.

클래스 데코레이터 학습 시 주의할 점은 무엇인가요?

클래스 데코레이터에서 원본 클래스를 반환하지 않으면 클래스가 None 으로 대체됩니다.