【问题标题】:Python: Decorator which return other decoratorPython:返回其他装饰器的装饰器
【发布时间】:2020-02-10 23:49:36
【问题描述】:

我有 2 个类用作装饰器

class A:
    """This is a decorator"""
    pass

class B:
    """This is also a decorator"""
    pass

还有我想返回 A 或 B 的第三类

class C:
    def a(func):
        return A

    def b(func):
        return B


@C.a
def some_func(some_arg):
    pass

@C.b
def other_func(some_arg):
    pass

有没有可能,如果有,如何实现?

更新: 问题在于,在创建装饰器时,会在创建过程中执行“call”。我想访问一些稍后设置的配置。所以我基本上我想做的是返回包装器,它返回包装器。

class C:
    def __call__(func):
        def wrapper(*args, **kwargs):
             # Do something with global data
             return func(*args, **kwargs)
        return wrapper

【问题讨论】:

  • 它是 python,几乎任何事情都可能以一种或另一种方式实现。你在这里写的方式有什么问题?
  • 看样子只需要使用@C.a()而不是@C.a

标签: python python-3.x python-decorators


【解决方案1】:

如果您希望您的确切代码工作,您需要做的就是将您的方法更改为属性:

class C:
    a = A
    b = B

不过,这是否是个好主意值得怀疑。如果你想让一个装饰器做两种不同的事情之一,二阶装饰器(即返回装饰器的函数)可能更合适。

【讨论】:

    【解决方案2】:

    您可以通过将 C 类更改为像这样工作来完成这项工作。

    class C:
        def a(func):
            return A(func)
    

    真正归结为理解装饰器只是一种语法快捷方式。

    @dec
    def f():
        pass
    

    完全一样:

    def f():
        pass
    f = dec(f)
    

    【讨论】:

      猜你喜欢
      • 2012-03-20
      • 1970-01-01
      • 2015-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-07
      • 2014-01-23
      相关资源
      最近更新 更多