데코레이터는 함수뿐 아니라 클래스에도 적용할 수 있습니다.
「클래스를 받아 변형된 클래스를 반환」하는 함수가 클래스 데코레이터입니다.
클래스 정의를 자동으로 보강하는 데 유용합니다.
기본 사용.
def add_repr(cls): def __repr__(self): return f"{cls.__name__}({self.__dict__})"; cls.__repr__ = __repr__; return cls.
@add_repr; class Person: def __init__(self, name): self.name = name.
p = Person("홍"); print(p) — "Person({'name': '홍'})".
클래스에 __repr__을 자동 추가한 셈입니다.
친숙한 예시들.
@dataclass — 가장 유명한 클래스 데코레이터.
__init__·__repr__·__eq__를 자동 생성.
@total_ordering(functools) — __lt__와 __eq__만 정의하면 나머지 비교 메서드 자동 생성.
@app.route(...)도 사실 클래스 데코레이터의 변형으로 자주 쓰입니다.
클래스 데코레이터의 매력은 「반복적인 보일러플레이트를 자동화」할 수 있다는 점입니다.
100개의 클래스에 같은 패턴을 적용해야 한다면, 한 데코레이터로 100번 적용하는 게 깔끔합니다.
더 강력한 변형으로 「메타클래스(metaclass)」가 있습니다.
클래스 자체의 생성을 통제하는 더 깊은 메커니즘이지만, 메타클래스는 매우 복잡해 일반 개발에서는 거의 안 씁니다.
대부분의 「클래스 자동 변형」은 클래스 데코레이터로 충분히 표현되며, 「메타클래스가 필요한 사람은 이미 자기가 그것이 필요하다는 것을 안다」는 농담이 있을 정도입니다.
한 줄 요약
클래스 데코레이터는 클래스를 받아 변형된 클래스를 반환합니다.
@dataclass·@total_ordering이 친숙한 예이며, 반복적 보일러플레이트 자동화에 강합니다.
더 알아볼 것
- 메타클래스와의 비교
- __init_subclass__ — 더 가벼운 대안
- 주의: 데코레이터의 부작용