簡體   English   中英

如何將實例變量傳遞給類定義中的裝飾器?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM