2013-05-23 2 views
6

나는 그것에 대해 뭔가를 시도했다. 데이터가 아닌 디스크립터가 구식 클래스에서 작동하는 이유는 무엇입니까?구식 클래스의 파이썬 설명자

문서에 따르면 다음과 같으면 안됩니다.
"Note that descriptors are only invoked for new style objects or classes (ones that subclass object() or type())."

class Descriptor(object): 
    def __init__(self): 
     self.x = 1 

    def __get__(self, obj, cls=None): 
     return self.x 


class A: 
    x = Descriptor() 

a = A() 
a.x 

>>> 1 

감사합니다.

+0

'설명자'는 새로운 스타일의 클래스이기 때문에. – martineau

답변

4

귀하는이 문서에 대해 의문의 여지가 있습니다. 나는 설명을 찾기 위해 CPython sources을 살펴 보았지만 경고를 받았다. 나는 전문가가 아니다. 그러니 내가 구현에 무언가, 또는 아무것도를 잃었

v = class_lookup(inst->in_class, name, &klass); 
if (v != NULL) { 
    f = TP_DESCR_GET(v->ob_type); 
    if (f != NULL) { 
     PyObject *w = f(v, (PyObject *)inst, (PyObject *)(inst->in_class)); 
    } 
} 

모순 된 (새로운 스타일의 객체가 필요합니다 나의 이해에서

__get__ 호출이 instance_getattr2 (선택 추출물)에서 발생 조회 및 설명 속성 문서).

기록을 위해 필자는 새로운 스타일 클래스 객체에 대한 설명자 호출을 제한하기 위해 Python을 다시 컴파일하려고 시도했지만 실제적으로 거대한 엉망이되었습니다. 이 과정에서 클래스 메서드 자체가 설명자로 구현된다는 것을 알게되었습니다.이 메서드는 사용법에 따라 바인딩 된 메서드 개체 나 바인딩되지 않은 메서드 개체를 반환하는 데 사용되는 메커니즘입니다. 예를 들어 :

>>> class A: 
...  def foo(): 
...   pass 
... 
>>> A.foo.__get__(None, A) 
<unbound method A.foo> 
>>> A.foo.__get__(A(), A) 
<bound method A.foo of <__main__.A instance at 0x000000000229CC48>> 
결과

, 또한 방법을 방해하는 이전 스타일의 객체 나 클래스의 속성에 대한 설명 호출을 방지하는 최소한의 CPython 구현, 그들을 부르는 것 같다.

다시 한번 나는 전문가가 아니며 파이썬 구현에 들어가기는 이번이 처음이므로 잘못 될 수 있습니다. 나는 이것을 명확히하기 위해 an issue을 신청했다.

+0

조사 해 주셔서 감사합니다. 정말 도움이됩니다. – alexvassel

+0

CPython에서 디버깅 세션을 마친 후 내 대답을 편집했습니다. 잘못된 함수가 포함되어 있었지만 그 결과는 그대로 유지됩니다. – icecrime

+0

다시 작업 해 주셔서 감사합니다. – alexvassel

관련 문제