2016-08-30 2 views
10

한 슬라이드 (번호 9)에서 Pythons의 함수가 설명 자임을 주장 할 때 Pythons 'Object model에서 a presentation을 읽었습니다. 함수가 나는의 설명 섹션에 설명 된대로 __get__ 그것이 기술자 인 정의 때문에,함수 설명자는 어떻게 작동합니까?

def mul(x, y): 
    return x * y 

mul2 = mul.__get__(2) 
mul2(3) # 6 

지금, 나는 지점이 만들어 이해 : 그는 설명하기 위해 제시 예는 내가 쓴이 하나와 유사한 파이썬 문서.

내가 이해할 수없는 것은 정확히 결과가 제공된 결과물을 출력한다는 것입니다.

답변

12

파이썬은 클래스에 동적으로 함수를 추가 할 수 있도록 파이썬이하는 일을합니다.

__get__는 함수 오브젝트 (보통 클래스의 인스턴스에 도트 액세스 . 통해 이루어) 파이썬 암시 (일반적 self 인식) 인스턴스 패스 방법에 대해 변환 함수를 같이 불려 때 첫 번째 인수.

>>> mul2 
<bound method mul of 2> 
: 명시 적으로
전화 __get__ 명시 적으로 기능 x의 첫 번째 인수로 바인딩 된 '예' 2을 통과, 여기 2은 "예" self 간주됩니다 귀하의 경우에는

, 당신은

결과는 인스턴스 2에 바인드 된 메소드로, 하나의 예상 인수가 곱셈을 생성합니다. 호출하면 2 (바인드 된 인수는 x에 할당 됨)에 anyth 그렇지 않으면 인수로 y을 입력하십시오.

일반적으로는, function()는 제공 적절한 인수와 __call__의 호출 :

플러스, 기능 __get__의 파이썬 구현으로
mul.__call__(2, 3) # 6 

은 파이썬 문서의 Descriptor HOWTO 문서로 제공됩니다.

class Function(object): 
    . . . 
    def __get__(self, obj, objtype=None): 
     "Simulate func_descr_get() in Objects/funcobject.c" 
     return types.MethodType(self, obj, objtype) 

을 그리고 흥미 방문자의 소스 코드는 Objects/funcobject.c에 있습니다

여기 __get__를 호출 할 때 발생 types.MethodType의 사용과, 변화를 볼 수 있습니다.

이 설명자가 존재하지 않았 음을 알 수 있듯이 불필요한 불편한 클래스에 함수를 동적으로 추가하려는 경우 언제든지 types.MethodType에 함수를 자동으로 래핑해야합니다.