디스크립터는 속성을 읽고 쓰고 지울 때 실행될 동작을 객체로 정의한다. 함수, property, classmethod도 이 데이터 모델 위에 있다.

class Depth:
    def __set_name__(self, owner, name):
        self.name = "_" + name

    def __get__(self, obj, owner):
        if obj is None:
            return self
        return getattr(obj, self.name)

    def __set__(self, obj, value):
        if value < 1:
            raise ValueError("depth")
        setattr(obj, self.name, value)

class Ai:
    depth = Depth()

`property`는 한 속성의 계산과 검증에 간단한 디스크립터 인터페이스를 제공한다. 메서드였던 API를 속성으로 바꿀 때 비용이 큰 작업이나 I/O를 숨기지 않는다.

데이터 디스크립터는 인스턴스 딕셔너리보다 우선하고, 비데이터 디스크립터는 인스턴스 속성에 가려질 수 있다. 메서드는 비데이터 디스크립터이며, 접근할 때 함수와 인스턴스를 묶은 bound method가 된다.

Python 27. 디스크립터와 속성 접근의 핵심 흐름도
그림. 디스크립터는 클래스 차원에서 속성 읽기와 쓰기 규칙을 재사용한다.