2012-02-03 2 views
5

__getattr__을 사용자 정의하여 읽을 다른 함수를 호출해야합니다.doc for __getattr__ 정의 된 속성

도움말 (object.attr)이 작동하지 않는 것을 제외하면 잘 작동합니다. 이 코드는 대화식 환경에서 사용되므로 help()가 중요하게됩니다.

동일한 기능을 구현하는 데 더 나은 디자인이 있지만 help()를 사용하면 효과적입니다.

답변

1

"도움말"에 사용되는 텍스트는 실제로 개체의 "__doc__"특성입니다. 문제는 당신이 갖고있는 객체에 따라 단순히 __doc__ 속성을 설정할 수 없다는 것입니다. 당신은 단지 __getattr__ 반환이 제대로 설정 문서화 문자열을 해일 않는 무엇이든 슈어을 얻어야한다 -

당신이 필요한 경우 "help(object.attr)"은 조금 더 쉽게 (그리고 그 help(object) 당신에게 가능한 모든 속성을 보여줍니다) 작동합니다. "이 작동하지 않습니다"때문에

난 당신이 코드에서와 같이, 어떤 함수 호출의 내부 결과를 반환하는 추측에는 요 :

def __getattr__(self, attr): 
    if attr == "foo": 
     #function "foo" returns an integer 
     return foo() 
    ... 

을 단순히 자체 기능 "foo는"반환하는 경우, 이것을 호출하지 않으면, docstring이 정상적으로 표시됩니다. 무엇을 할 수 있는지

가 동적으로 생성 된 클래스 느릅 나무의 개체로 __getattr__에 반환 값을 래핑하는 것입니다 가 적절한 문서화 문자열을 포함

- 그래서,이 같은 somethong 사용해보십시오 :

def __getattr__(self, attr): 
    if attr == "foo": 
     #function "foo" returns an (whatever object) 
     result = foo() 
     res_type = type(result) 
     wrapper_dict = res_type.__dict__.copy() 
     wrapper_dict["__doc__"] = foo.__doc__ #(or "<desired documentation for this attribute>") 
     new_type = type(res_type.__name__, (res_type,), wrapper_dict) 
     # I will leave it as an "exercise for the reader" if the 
     # constructor of the returned object can't take an object 
     # of the same instance (python native data types, like int, float, list, can) 
     new_result = new_type(result) 
    elif ...: 
     ... 
    return new_result 

이 작동합니다 -하지 않는 한 나는 처음부터 hel가 작동하지 않는 이유를 잘못 알고 있습니다. 그렇다면 __getattr__에서 돌아 오는 것을 보여주세요.

+0

Thannks, 제 경우에는 작동합니다. __getattr__의 모든 attr은 기본 파이썬 데이터 유형을 반환합니다. –

1

속성을 속성으로 설정할 수 있습니다. 이 속성은 getter 메서드의 docstring을 자동으로 사용합니다. 또는 property()doc 인수를 제공 할 수 있습니다.

+0

내부 __getattr__은 attr을 매개 변수로 사용하는 함수 호출입니다. 속성()을 사용할 수 있습니까? 이 속성은 동적이며 객체 생성시 알려지지 않습니다. –