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 으로 대체됩니다.
Continue Learning
Python 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.