2014-09-22 2 views
3

내 장식에 Functools.update_wrapper()을 사용하여 작동하지 않습니다, 그러나 그것은 단지 기능 (예 : __doc__, __name__ 등) 속성 update_wrapper 재 작성처럼 보이지만, help() 기능에 영향을주지 않습니다.Functools.update_wrapper는()가 제대로

저는 these answers을 알고 있지만 데코레이터 클래스에서는 작동하지 않습니다.

여기 내 기능입니다. 여기

import functools 

class memoized(object): 

    def __init__(self, func): 
     self.func = func 
     functools.update_wrapper(self, func) 

    def __call__(self, *args): 
     self.func(*args) 

@memoized 
def printer(arg): 
    "This is my function" 
    print arg 

그것은 버그처럼 보이는 출력

>>> printer.__doc__ 
This is my function 

>>> help(printer) 
Help on memoized in module __main__ object: 

printer = class memoized(__builtin__.object) 
| Methods defined here: 
| 
| __call__(self, *args) 
| 
| __init__(self, func) 
| 
| ---------------------------------------------------------------------- 
| Data descriptors defined here: 
| 
| __dict__ 
|  dictionary for instance variables (if defined) 
| 
| __weakref__ 
|  list of weak references to the object (if defined) 

,하지만 난 그것을 어떻게 해결할 수 있습니까?

답변

7

functools.update_wrapper() 인스턴스에 속성 을 설정하지만 help()는 유형에 대한 정보 본다.

그래서 printer.__doc__은 인스턴스 속성을 제공합니다. help()type(printer)에 대한 정보를 인쇄합니다. memoized 클래스에는 __doc__ 특성이 없습니다.

이것은 버그가 아니며, 의도적으로 설계된 동작입니다. help() will always look at the class when you pass in an instance. 장식 된 함수로 help()을 사용하려면 클래스를 장식 자로 사용하지 마십시오.

+0

그래서 클래스를 데코레이터로 사용하는 한 그것을 고칠 방법이 없습니다. – user3664218

+0

@ user3664218 : 참으로; 'help()'는 인스턴스가 아닌 클래스에 대한 정보를 제공하며, 후자를 원한다면 클래스 데코레이터를 사용하면 안됩니다. –

+0

이것은 클래스 데코레이터가 부분적으로 손상되었음을 의미합니다. 이 디자인의 타당성은 무엇입니까? –