【问题标题】:What is the correct way to define a python decorator in a class?在类中定义 python 装饰器的正确方法是什么?
【发布时间】:2015-12-06 05:42:29
【问题描述】:

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

  • 这里1
  • 这里2
  • 这里 3 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

【问题讨论】:

    标签: python decorator python-decorators functools


    【解决方案1】:

    您似乎只是打错了几个字,实际上并没有调用函数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.
    

    【讨论】:

    • 感谢您的收获。我也喜欢清理建议;好多了。
    猜你喜欢
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 2014-10-04
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多