백엔드 개발 · 심화
Python의 디스크립터(Descriptor) 프로토콜은 무엇이며, `__get__`, `__set__`, `__delete__` 메서드가 어떻게 동작하는지 설명해주세요. 또한, 실제 코드에서 디스크립터를 활용하여 속성 접근을 제어하는 실용적인 예시를 제시해주세요.
힌트 · `property`의 내부 구현 원리와 관련지어 설명하고, 속성 유효성 검사, 캐싱, 지연 로딩 등 특정 로직을 속성 접근에 연결하는 방법을 예시로 드세요.
디스크립터 프로토콜__get____set____delete__속성 접근 제어
모범답안
디스크립터 프로토콜은 객체의 속성 접근(get, set, delete) 동작을 제어하는 메커니즘입니다. __get__, __set__, __delete__ 메서드를 가진 클래스를 디스크립터라고 부르며, 이 메서드들을 통해 속성 접근 시 특별한 로직을 수행할 수 있습니다.
__get__은 속성 값을 가져올 때 호출됩니다. __set__은 속성 값을 설정할 때, __delete__는 속성을 삭제할 때 호출됩니다.
예를 들어, 속성 값의 유효성을 검사하는 디스크립터를 만들 수 있습니다.
class ValidatedNumber:
def __set_name__(self, owner, name):
self.private_name = '_' + name
def __set__(self, instance, value):
if not isinstance(value, (int, float)):
raise ValueError("숫자만 할당 가능합니다.")
instance.__dict__[self.private_name] = value
def __get__(self, instance, owner):
return instance.__dict__.get(self.private_name)
class MyClass:
number = ValidatedNumber()
이 예시에서 number 속성에 숫자가 아닌 값을 할당하려고 하면 ValueError가 발생합니다. property도 내부적으로 디스크립터 프로토콜을 사용하여 구현됩니다. 디스크립터를 활용하면 속성 접근에 대한 세밀한 제어가 가능해져 유효성 검사, 캐싱, 지연 로딩 등 다양한 기능을 구현할 수 있습니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.