패스잇
백엔드 개발 · 심화

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 코칭합니다.

함께 보는 Python 면접 질문

← Python 면접 질문 전체 보기