2016-10-05 7 views
-3

클래스 작성시 데이터 설명자를 사용하는 동안 클래스에서 getattr 기능의 이상한 동작이 발생했습니다. 우변은 String의 인스턴스를 반환하면서데이터 설명자가있는 클래스에서 getattr 사용

# this is a data descriptor 
class String(object): 
    def __get__(self, instance, owner): 
     pass 
    def __set__(self, instance, value): 
     pass 

# This defines a class A with 'dot' notation support for attribute 'a' 
class A(object): 
    a = String() 

obj = A() 
assert getattr(A, 'a') is A.__dict__['a'] 
# This raises AssertionError 

LHS는 빈 문자열을 반환합니다. 개체의 getattr__dict__ 내부의 키 값을 가져 오는 것이라고 생각했습니다. getattr 함수는 클래스 객체에서 어떻게 작동합니까?

+0

'None'이 아닌 빈 문자열을 반환합니까? – Bakuriu

+0

* LHS는 빈 문자열을 반환합니다. * 확실합니까? 나는 노력하면서'None'을 반환합니다. 왜 안 되니? 당신은 디스크립터에서 그렇게 말합니다! – glglgl

+1

BTW :'A.a'는 ** 아닙니다 **는'.__ dict __ [ 'a']'와 같습니다. 첫 번째 요소 만 "전체 특성 메커니즘"을 트리거합니다. – Bakuriu

답변

1

getattr(A, 'a')은 클래스에서도 설명자 프로토콜을 트리거하므로 String.__get__(None, A)이 호출됩니다.

String.__get__() 메서드에 명시적인 return 문이 없기 때문에 None을 반환합니다. Descriptor Howto 가입일

:

클래스는 기계 B.__dict__['x'].__get__(None, B)B.x로 변환 type.__getattribute__()이다.

getattr(A, 'a')A.__dict__['x'] 같은 일을하지 않는 이유입니다, 그래서 A.__dict__['x'].__get__(None, A) 실행 여기 A.a의에서 불과 동적입니다.

설명자 개체 자체를 반환 할 것으로 예상되는 경우 을 명시 적으로 사용해야합니다. instance이 경우에 None로 설정됩니다

class String(object): 
    def __get__(self, instance, owner): 
     if instance is None: 
      return self 
    def __set__(self, instance, value): 
     pass 

이것은 property 기술자 객체가하는 일입니다.

descriptor.__get__에 대한 owner 인수는 선택 사항입니다. 설정되지 않은 경우 대신 type(instance)을 사용해야합니다.

0

getattr(A, 'a')A.a과 동일합니다. 이것이 존재하는 경우, 각각의 기술자를 호출한다. 따라서 설명자가 제시 한 값인 None을 제공합니다.