0

我想要实现的是以下代码输出以下内容:

  • 这里1
  • 这里2
  • Here3 argOne argTwo

我想知道我对 __call__ 的使用是否会以某种方式破坏 functools.wraps; 似乎这些论点在某些时候丢失了。

我想要实现的目标是可能的吗?

from functools import wraps

class Decorator():

    def __init(self, something=None):
            self.something = something

    def __call__(self, func):
            print 'Here1'
            @wraps(func)
            def _wrapper(*args, **kwargs):
                return self.call(func, *args, **kwargs)
            return _wrapper

    def call(self, func, *args, **kwargs):
            print 'Here2'
            retsult = func(*args, **kwargs)
            return result


if __name__ == '__main__':

    decorator = Decorator()

    @decorator
    def do_the_thing(arg1='argOne', arg2='argTwo'):
            print 'Here3 {0} {1}'.format(arg1, arg2)
            return
4

1 回答 1

1

似乎您只是有一些拼写错误,实际上并没有调用该 function do_the_thing

把它改成这个并且工作得很好。

from functools import wraps


class Decorator():

    def __init__(self, something=None): # you are missing the __ on the right
            self.something = something

    def __call__(self, func):
            print 'Here1'
            @wraps(func)
            def _wrapper(*args, **kwargs):
                return self.call(func, *args, **kwargs)
            return _wrapper

    def call(self, func, *args, **kwargs):
            print 'Here2'
            result = func(*args, **kwargs) # result was misspelled
            return result


if __name__ == '__main__':

    @Decorator() # Just a bit cleaner
    def do_the_thing(arg1='argOne', arg2='argTwo'):
            print 'Here3 {0} {1}'.format(arg1, arg2)

    do_the_thing() # func was never called.
于 2015-09-10T05:01:24.513 回答