【问题标题】:Python decorators theoryPython 装饰器理论
【发布时间】:2012-06-18 09:05:13
【问题描述】:

我对 Python 中的干净理论有疑问。时间:

@decorator_func
def func(bla, alba):
    pass

相当于:

def func(bla, alba):
    pass
func = decorator_func(func)

所以:

@decorator_func(aaa, bar)
def func(bla, alba):
    pass

等价于...?

【问题讨论】:

    标签: python decorator theory


    【解决方案1】:

    相当于:

    def func(bla, alba):
        pass
    func = decorator_func(aaa, bar)(func)
    

    或者:

    def func(bla, alba):
        pass
    decorator = decorator_func(aaa, bar)
    func = decorator(func)
    

    因此,在您的第二个示例中,decorator_func 应该是一个返回可调用对象的可调用对象。

    下面是这种结构的一个例子:

    class prepend_two_arguments:
        def __init__(self, a, b):
            self.a = a
            self.b = b
    
        def __call__(self, f):
            def wrapped_function(*args, **kwargs):
                return f(self.a, self.b, *args, **kwargs)
            return wrapped_function
    
    @prepend_two_arguments(1,2)
    def f(a, b, c):
        return a+b+c
    print(f(3)) # 6
    

    还有一个,只使用函数:

    def add_to_result(x):
        def decorator(fn):
            def wrapped_function(*args, **kwargs):
                return fn(*args, **kwargs)+x
            return wrapped_function
        return decorator
    
    @add_to_result(3)
    def my_func(a, b):
        return a+b
    print(my_func(1,2)) # 6
    

    【讨论】:

      【解决方案2】:

      下面是一个使用闭包的装饰器函数示例:

      def print_string_before(string):
          def decorator_fn(fn):
              def wrapped_fn(*args, **kwargs):
                  print string
                  return fn(*args, **kwargs)
              return wrapped_fn
          return decorator_fn
      

      请注意,装饰器同样可以返回被装饰的函数(或类),并以某种方式对其进行修改(例如设置属性)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-27
        • 2013-08-07
        • 2014-01-23
        • 1970-01-01
        • 2021-05-20
        • 2021-07-11
        相关资源
        最近更新 更多