将类属性作为装饰器参数访问

问题描述 投票:1回答:1

我正在尝试按照另一个stackoverflow文章中的描述应用conditional decorator,但我希望从使用其的类内部设置条件。相反,我收到一个引用错误,指出未定义自我。

class foo:
    def __init__(self):
        self.debug = True

    @conditional_decorator(decorator, self.debug)
    def function(self):
        pass

我尝试定义一个全局变量并从__ init __()方法内部对其进行更新,但在作为装饰器的参数调用时,它保留了其原始值。

debug = None

class foo:
    def __init__(self):
        self.debug = True
        global debug
        debug = self.debug

    @conditional_decorator(decorator, debug)
    def function(self):
        pass

唯一有效的方法是声明一个全局变量并将其设置在类之外。

如何将class属性的值应用于装饰器?

python class decorator
1个回答
0
投票

这是使装饰器处理类和参数的方式:

from functools import wraps


def conditional_decorator(param):
    def real_decorator(fn):
        @wraps(fn)
        def wrapper(*args, **kw):
            cls = args[0]
            print(cls.debug)
            print(param)
        return wrapper
    return real_decorator


class foo:
    def __init__(self):
        self.debug = True

    @conditional_decorator('param1')
    def function(self):
        pass



f = foo()
f.function()

输出:

True
param1
© www.soinside.com 2019 - 2024. All rights reserved.