首页 > 解决方案 > 访问类属性作为装饰器参数

问题描述

我正在尝试应用另一个stackoverflow帖子中描述的条件装饰器,但我希望从正在使用的类内部设置条件。相反,我得到一个参考错误,指出 self 没有定义。

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

它起作用的唯一方法是声明一个全局变量并将其设置在类之外。

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

标签: pythonclassdecorator

解决方案


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

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

推荐阅读