gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:03:15 26 4
gpt4 key购买 nike

我想使用一个接受参数的装饰器,检查该参数是否为 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

关于python - 如何将实例变量传递给类定义内的装饰器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17522706/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com