최근에 저는 official HOW-TO about Python descriptors을 읽었습니다. 실제로는 오래 전 Raymond Hettinger가 작성한 an essay에서 파생되었습니다. 그러나 여러 번 읽은 후에도 나는 그 부분에 대해 여전히 혼란 스럽습니다. 나는 약간의 단락을 인용 할 것이고, 뒤이어 나의 혼란과 질문이 올 것이다. 인스턴스의 사전 데이터 기술자와 같은 이름을 가진 항목이있는 경우파이썬 설명자와 <기술자 하우투 가이드>에 대한 혼란
는, 데이터 기술자가 우선합니다. 인스턴스의 사전에 비 데이터 디스크립터와 이름이 같은 항목이있는 경우 사전 항목이 우선 적용됩니다.
- 이것은 클래스와 동일합니까? 사전에 데이터/비 데이터 설명 자와 같은 이름의 항목이있는 경우 클래스의 우선 순위 체인은 무엇입니까? 개체 용
는 기계에
type(b).__dict__['x'].__get__(b, type(b))
b.x
변환object.__getattribute__()
이다. 구현은 인스턴스 변수에 비해 데이터 설명자를 우선시하고, 데이터가 아닌 디스크립터에 우선 순위가있는 인스턴스 변수를 제공하는 우선 순위 체인을 통해 작동하며, 제공된 경우 가장 낮은 우선 순위를__getattr__()
에 할당합니다.클래스의 경우 기계류는 이고
B.x
은B.__dict__['x'].__get__(None, B)
으로 변환됩니다.
- 위의 두 단락는 속성 접속시 자동으로 호출되는 기술자의 존재의 과정을 말한다. 인스턴스 (
b.x
)와 클래스 (B.x
)가 액세스하는 속성의 차이점을 나열합니다. 클래스의 속성 또는 인스턴스 기술자 아닌 경우 것이다 변환 여전히 진행 (즉,B.__dict__['x'].__get__(None, B)
에type(b).__dict__['x'].__get__(b, type(b))
및B.x
b.x
로 변환)- 그러나, 여기에 내 혼란인가? 이 클래스 또는 인스턴스의 속성을 dict으로 반환하는 것이 더 간단합니까?
- 첫 번째 따옴표의 우선 순위 규칙에 따라 인스턴스의 사전에 비 데이터 설명자와 같은 이름의 항목이있는 경우 사전 항목이 우선 적용됩니다. 이때 변환은 계속 진행됩니까? 또는 dict의 값을 반환 하시겠습니까?
비 데이터 디스크립터 메소드에 바인딩 함수의 일반적인 패턴을 변화하기위한 간단한 메커니즘을 제공한다.
- 는 기능/방법 만이 입수 할 수 있기 때문에 비 데이터 서술자가 선택되지만이을 설정할 수없는?
- 함수를 메서드에 바인딩하는 기본 메커니즘은 무엇입니까?클래스 사전은 메소드를 함수로 저장하므로 클래스와 인스턴스를 각각 사용하여 동일한 메소드를 호출하면 기본 함수가 첫 번째 인수가 자체이어야하는지 여부를 어떻게 알 수 있습니까? 속성으로 액세스 할 때이 방법으로 변환 할 수 있도록
기능은
__get__()
방법이있다. 비 데이터 기술자는obj.f(*args)
호출을f(obj, *args)
으로 변환합니다.klass.f(*args)
을 호출하면 f (* args)가됩니다.
- 방법이 아닌 데이터 기술자는
f(obj, *args)
에obj.f(*args)
전화를 변환 할 수 있습니까? - 비 데이터 설명자가
klass.f(*args)
전화를f(*args)
으로 변환 할 수 있습니까? - 위의 두 변형의 기본 메커니즘은 무엇입니까? 왜 클래스와 인스턴스간에 차이가 있습니까?
- 위의 상황에서
__get__()
메서드는 어떤 역할을합니까?