필자는 머리말을 디스크립터 개념으로 바꾸려고 노력하고 있으며 최근에는 성공하지 못했습니다. 이 article의 설명자를 어떻게 도왔으며 동시에 나 또한 혼란 스러웠습니다. 나는 m.x
가 나는 기사"descriptors howto"기사에서의 설명자 예제 이해
를 제공하는 경우 어떻게 저자 확실하지 않다세부 사항에 다음과 같은 성명에 의해 혼동하고 있기 때문에 내가이 고민하고있는 이유는 생각
def __get__(self, obj, objtype):
class RevealAccess(object): def __init__(self, initval=None, name='var'): self.val = initval self.name = name def __get__(self, obj, objtype): print('Retrieving', self.name) return self.val def __set__(self, obj, val): print('Updating', self.name) self.val = val >>> class MyClass(object): ... x = RevealAccess(10, 'var "x"') ... y = 5 ... >>> m = MyClass() >>> m.x Retrieving var "x" 10
를 호출하는 이유는 여기에 이 예를 고민하고있다 호출은 obj가 객체인지 또는 클래스인지에 따라 달라집니다. 물체의 경우 기계류는
b.x
을type(b).__dict__['x'].__get__(b, type(b))
으로 변환하는object.__getattribute__()
에 있습니다. 구현은 인스턴스 변수, 우선 순위가 아닌 데이터 기술자를 통해 인스턴스 변수를 통해 데이터 기술자 우선 순위를 부여하는 우선 순위 체인을 통해 작동하고,
__getattr__()
에 가장 낮은 우선 순위를 할당 여기 개체 또는 클래스를 의미합니다. 객체는 클래스의 인스턴스를 의미합니까? 나는 우리가
instance.var
파이썬 내부적으로
instance.__dict__["var"]
을 수행 할 때 그것을 찾지 못하면
class.__dict__["var"]
을 수행한다는 것을 이해합니다. 나는 그 개념을 잃어 버렸습니다. 누구나이 예제가 어떻게 작동하는지 조금 설명 할 수 있을까요?
def __get__(self, obj, objtype):
의 정의는
m.x
과 어떻게 관련이 있습니까? 아무도이 문제를 해결할 수 있다면 매우 감사 할 것입니다.
매개 변수 이름'def __get __ (self, instance, owner)'를 사용하면 명확해질 수 있습니다. 'RevealAccess'는 기술자 클래스이고 MyClass는 소유자 클래스입니다. 클래스는 객체이므로,'owner'는 클래스 객체'MyClass'가됩니다. – cdarke