[英]How to pass an instance variable to a decorator inside class definition?
我想使用一个装饰器,它接受一个参数,检查该参数是否不是 None,如果 True 它让装饰的函数运行。
我想在类定义中使用这个装饰器,因为我有一组类方法,它们首先检查特定的实例变量是否为 None 。 我认为如果我使用装饰器会更好看。
我想做这样的事情:
# decorator
def variable_tester(arg):
def wrap(f):
def wrapped_f(*args):
if arg is not None:
f(*args)
else:
pass
return wrapped_f
return wrap
# class definition
class my_class(object):
def __init__(self):
self.var = None
@variable_tester(self.var) # This is wrong. How to pass self.var to decorator?
def printout(self):
print self.var
def setvar(self, v):
self.var = v
# testing code
my_instance = my_class()
my_instance.printout() # It should print nothing
my_instance.setvar('foobar')
my_instance.printout() # It should print foobar
这有点棘手,因为你想做几件事,每件事都有点挑剔:(1)你想将一个参数传递给装饰器,(2)你希望该参数引用实例,但实例装饰时不存在,所以我们必须以某种方式推迟它。 你可以使用函数或itemgetter
,但在这里我将使用一个字符串,我不会像我应该那样使用functools.wraps
因为我很懒。
就像是:
# really, it's variable-tester-factory
def variable_tester(target):
def deco(function):
def inner(self, *args, **kwargs):
if getattr(self, target) is not None:
return function(self, *args, **kwargs)
return inner
return deco
class my_class(object):
def __init__(self):
self.var = None
@variable_tester('var')
def printout(self):
print self.var
应该工作:
>>> a = my_class()
>>> print a.var
None
>>> a.printout()
>>> a.var = 'apple'
>>> a.printout()
apple
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.