访问类属性作为decorator参数



我正试图应用另一篇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

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

如何将类属性的值应用于decorator?

对@Maurice Meyer给出的答案的更新,允许提名该类成员:

from functools import wraps
def conditional_decorator(decoration, member):
def decorator(method):
predecorated = decoration(method)
@wraps(method)
def wrapper(*args, **kwargs):
self = args[0]
condition = getattr(self, member)
if not condition:
return method(*args, **kwargs)
return predecorated(*args, **kwargs)
return wrapper
return decorator
#And used like this for example:
class foo:
def __init__(self, debug):
self.debug = debug
@conditional_decorator(decorator, "debug")
def function(self):
pass
f1 = foo(True)
f1.function()

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

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

装饰器不应该是有条件的。相反,当调用修饰函数时,它应该查看self.debug,以确定是使用原始函数还是使用包装部分。

def conditional_decorator(dec):
def decorator(func):
def _(self, *args, **kwargs):
f = func
if self.debug:
f = dec(f)
return f(self, *args, **kwargs)
return _
return decorator

def decorator(f):
def _(*args, **kwargs):
print("Decorated")
return f(*args, **kwargs)
return _

class foo:
def __init__(self, debug):
self.debug = debug
@conditional_decorator(decorator)
def function(self):
print("foo stuff")
foo(True).function()
print("===")
foo(False).function()

输出

Decorated
foo stuff
===
foo stuff

最新更新