首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:返回其他装饰器的装饰器

Python:返回其他装饰器的装饰器
EN

Stack Overflow用户
提问于 2019-10-14 10:56:08
回答 2查看 45关注 0票数 0

我有两个类用作装饰器

代码语言:javascript
复制
class A:
    """This is a decorator"""
    pass

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

还有一个我想退货的第三级,要么A要么B

代码语言:javascript
复制
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

这种情况有可能发生吗?如果有,如何实现?

更新:问题是在创建装饰器时,在创建过程中执行‘调用’。我想访问一些配置,这些配置将在稍后设置。基本上,我要做的是返回包装器,返回包装器。

代码语言:javascript
复制
class C:
    def __call__(func):
        def wrapper(*args, **kwargs):
             # Do something with global data
             return func(*args, **kwargs)
        return wrapper
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-14 11:11:38

如果您想让您的确切代码正常工作,只需将方法更改为属性:

代码语言:javascript
复制
class C:
    a = A
    b = B

不过,这是否是一个好主意值得商榷。如果您想要一个装饰器来完成两种不同的事情之一,那么二阶装饰器(即返回装饰器的函数)可能更合适。

票数 2
EN

Stack Overflow用户

发布于 2019-10-14 11:23:01

你可以通过把C类改变成这样来完成这个任务。

代码语言:javascript
复制
class C:
    def a(func):
        return A(func)

它实际上归结为理解,一个装潢师只是一个句法捷径。

代码语言:javascript
复制
@dec
def f():
    pass

与以下完全相同:

代码语言:javascript
复制
def f():
    pass
f = dec(f)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58375327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档