PEP-343은이 상황에서 type()을 사용하는 이유는 무엇입니까?메서드 호출에 type() 사용
mgr = (EXPR)
exit = type(mgr).__exit__ # Not calling it yet
value = type(mgr).__enter__(mgr)
우리는 단지뿐만 아니라 exit = mgr.__exit__
및 value = mgr.__enter__()
를 사용할 수 없습니다? 나에게 더 단순 해 보이지만 나는 뭔가를 놓치고 있다고 생각한다.
좋습니다. 그래서 누군가가 __dict__ 인스턴스를 변경하면 우리는 여전히 원래의 함수를 호출합니다. 그것에 대해 생각조차하지 않았다 - 내가하고 싶은 상황을 아직 찾지 못했다.)하지만 누군가가 그랬다면 이상한 행동으로 이어질 수있다. – Voo
@Voo : 컨벤션의 이론적 근거는 이상한 행동을 피하는 것이 아닙니다. 즉, 'a' 인스턴스의'__add __()'메소드를 on-the-fly 타입으로 오버라이드하여 덮어 쓸 수 있습니다 :'a. __class__ = type ("", (type (a),), { "__add__": 람다 셀프, other : 42})'. 대신,이 동작에 대한 이론적 근거는 성능입니다. 특별한 메소드는 타입의'__dict__'에서 찾지 않습니다. 내부 형식 데이터 구조는 특수 메서드에 대한 포인터를위한 특수 필드를 제공하므로 훨씬 빠르게 조회 할 수 있습니다 (http://docs.python.org/extending/newtypes.html#the-basics 참조). –
PyMethodDef 배열을 의미합니까? 여전히 검색해야하지만 (더 빠를 수도 있습니다)? 아니면 우리가 모든 특수 메소드에 대해 하나의 일반적인 메소드를 사용하도록하기 위해 이렇게했습니다. tp_iternext와 같은 일부 메소드는 PyTypeObject에서 선언 되었기 때문에 이익을 얻습니다. – Voo