2012-03-14 2 views
11

파이썬 2.7.2를 사용하고 있습니다. 함수 호출과 함수의 __call__ 특성 호출 사이의 관계를 이해하고 싶습니다. 예를 들어, 네 개의 선이 기능 foo 호출을 표시하는 것 다음 코드를파이썬 함수와 그 __call__ 속성 ​​

def foo(): 
    return 5 
print foo()   # ==> 5 
print foo.__call__() # ==> 5 

foo.__call__ = lambda : 6 
print foo()   # ==> 5 
print foo.__call__() # ==> 6 

최초를 고려하는 것은 foo__call__ 속성을 호출하는 것과 동일합니다. 그러나 마지막 세 줄은 __call__ 특성을 변경 한 이후 다른 짐승임을 나타내지 만 foo()이라는 호출에서 반환 된 값은 변경되지 않았습니다.

누군가 foo()을 호출하고 foo.__call__()을 호출하는 관계를 설명 할 수 있습니까? foo()foo.__call__()이 5 대신 6을 반환하도록 함수의 동작을 수정하는 방법이 있습니까?

+0

'foo .__ call__'을 (를) 수정해야하는 이유는 없습니다. 대신'foo'를 수정할 수 있습니다! – katrielalex

+0

그럼에도 불구하고 그것은 이상한 행동입니다. 좋은 질문이 있습니다. –

답변

11

special method lookup for new-style classes (특히 마지막 단락)을 읽는 것이 좋습니다. 객체의 타입, 객체의 인스턴스 사전에없는 에 정의 된 경우 새로운 스타일의 클래스

은 특별한 방법의 암시 적 호출은 는 제대로 작동을 보장한다.

+2

함수가 객체이고 거기에 속한 클래스가 ('') 등이기 때문에 우리가 함수로 작업한다는 사실이 실제로 중요하지 않은지에 대해 자세히 설명해야합니다. ... –

관련 문제