프로그래밍시니어 파이썬 개발자

파이썬에서 디스크립터란 무엇인가? 어떻게 구현되며, 어떤 용도로 사용되는가, property와의 차이는 무엇이며, 사용 시 일반적인 오류는 무엇인가?

Hintsage AI 어시스턴트로 면접 통과

답변

디스크립터는 get, set, delete 중 하나 이상의 메서드를 구현하는 객체입니다. 이는 클래스 속성에 대한 접근을 제어할 수 있게 합니다.

디스크립터의 표준 메서드:

  • __get__(self, instance, owner)
  • __set__(self, instance, value)
  • __delete__(self, instance)

디스크립터에는 다음과 같은 종류가 있습니다:

  • 클래식 디스크립터(data descriptors) — __set__을 구현하며 일반 속성보다 우선순위를 가집니다;
  • 비클래식 디스크립터(non-data descriptors) — __get__만 구현하며 일반 속성에 뒤처집니다.

사용 예:

class OnlyPositive: def __init__(self): self._name = '_value' def __get__(self, instance, owner): return instance.__dict__[self._name] def __set__(self, instance, value): if value < 0: raise ValueError('값은 >= 0이어야 합니다') instance.__dict__[self._name] = value class Account: value = OnlyPositive() def __init__(self, value): self.value = value acc = Account(10) acc.value = -1 # ValueError!

property는 클래스 수준에서 디스크립터를 생성하기 위한 단순한 문법적 설탕입니다.

함정 질문

인스턴스의 속성으로 디스크립터를 생성하면 어떻게 될까요?

많은 사람들이 디스크립터가 작동할 것이라고 생각하지만, 그렇지 않습니다.

올바른 답변:

디스크립터는 클래스 속성으로 직접 정의되어야만 작동합니다. 디스크립터를 인스턴스 속성으로 지정하면 get/set 메서드가 호출되지 않으며, 일반적인 속성 접근 논리가 적용됩니다.

주제에 대한 세밀한 이해 부족으로 인한 실제 오류 예


이야기

전체 디스크립터 대신 property 사용

검증 및 기타 관련 속성을 위해 개발자는 간단한 property를 사용했으며, 이로 인해 로직의 중복이 잦아지고 서로 다른 클래스 간 코드 재사용이 불가능해졌습니다.


이야기

저장소 재사용 시 불변성 준수 누락

디스크립터가 자신의 클래스의 내부 속성(self.x)에 데이터를 저장했고, 인스턴스의 내부 저장소에 저장하지 않았기 때문에 속성이 "공유"되어 클래스의 서로 다른 인스턴스들이 서로에게 값을 덮어쓰고 데이터가 객체 간에 "누출"되었습니다.


이야기

data descriptor와 non-data descriptor를 혼동

복잡한 계층에서 __set__의 구현이 누락되어 일반 인스턴스 속성이 디스크립터를 덮어쓰게 되어 검증 메커니즘이 깨졌습니다 — 버그는 항상 발생하지 않으며 디버깅이 까다로웠습니다.