首先,我不知道这是否是正确的做法。我想写一个将与其他类的方法一起使用的装饰器类。在运行该方法之前,我想检查是否已初始化所有必需的类变量。理想情况与此类似:
class Test(object):
def __init__(self, f):
self.f = f
# some magic
def __call__(self):
self.f.magically_get_variable(required)
# do some checks and execute method or throw an exception
class Data(object):
def __init__(self, a, b):
self.a = a
@test
def sum(self):
required('self.a', 'self.b')
return self.a + self.b
如果不是这样的话,请告诉我如何正确地做到这一点。
答案 0 :(得分:1)
我认为装饰器在这里有点不合适,目的是检查变量是否存在。
如果未提供所需的变量,请考虑您计划执行的操作:引发异常(它在您的评论中)。
我会说(基于上面的代码):
def sum(self):
return self.a + self.b
让它失败如果没有提供self.a或self.b(它会引发NameError
异常,你可以抓住它,如果你喜欢,你可以提高你的如果你愿意的话可以拥有。)
答案 1 :(得分:0)
如果你坚持在装饰方法的身体开始之前检查,以下是一种合理的方法......:
import functools
class test(object):
def __init__(self, requiredvars):
self.reqs = requiredvars.split()
def __call__(self, f):
@functools.wraps(f)
def wrapper(wself, *a, **k):
missing = set()
for v in self.reqs:
if not hasattr(wself, v):
missing.add(v)
if missing:
msg = 'missing fields: %s' % ','.join(sorted(missing))
raise valueerror, msg
return f(wself, *a, **k)
return wrapper
class data(object):
def __init__(self, a, b):
self.a = a
@test('a b')
def sum(self):
return self.a + self.b
d = data(23, 42)
d.sum()
这就像你显然想要的那样发出
Traceback (most recent call last):
File "rev.py", line 29, in <module>
d.sum()
File "rev.py", line 16, in wrapper
raise ValueError, msg
ValueError: Missing fields: b