Python 如何将实例变量传递给类定义内的装饰器?

Python 如何将实例变量传递给类定义内的装饰器?,python,python-decorators,Python,Python Decorators,我想使用一个接受参数的装饰器,检查该参数是否为None,如果为True,则允许装饰函数运行 我想在类定义中使用这个decorator,因为我有一组类方法,首先检查特定的实例变量是否为None。我想如果我用一个装饰师会更好看 我想这样做: # decorator def variable_tester(arg): def wrap(f): def wrapped_f(*args): if arg is not None:

我想使用一个接受参数的装饰器,检查该参数是否为None,如果为True,则允许装饰函数运行

我想在类定义中使用这个decorator,因为我有一组类方法,首先检查特定的实例变量是否为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.wrapps
,因为我很懒

比如:

# 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

“或者一个
itemgetter
”:或者甚至是一个-的存在,直到现在我才意识到它的存在。@glglglgl:好的,这样你就不必添加
\uuu getitem\uuuu