python - 访问类属性作为装饰器参数
问题描述
我正在尝试应用另一个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
它起作用的唯一方法是声明一个全局变量并将其设置在类之外。
如何将类属性的值应用于装饰器?
解决方案
这是让装饰器处理类和参数的方式:
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
推荐阅读
- html - Firefox 在图像中显示覆盖的奇怪错误
- javascript - 无法显示标记。setMarkers() 函数返回 TypeError: t.map is not a function
- python - 如何合并多个csv文件
- python - 如何解决我的while循环永不停止?
- javascript - 如何在对象中显示数据
- c# - 插入后加载导航属性
- laravel - Laravel Eloquent HasManyThrough 关系
- android - 我应该在 android.app.Application 中使用哪个协程范围?
- javascript - 如何在 v-autocomplete(vuejs & vuetify) 上使第二个值可选
- gekko - GEKKO - 通用 - 自定义可重复使用的流程图对象 - 化学工艺流程建模