我有一个有几个状态变量的Python类-让我们称他们self.state和self.process:
class MyClass(object):
def __init__(state=None, process=None):
self.state = state
self.process = process
Run Code Online (Sandbox Code Playgroud)
现在,我的应该产生一个错误,如果方法有很多self.state,并self.process没有.我不想为每个人手动编码测试,所以我在想,我会做一个装饰器 - 像这样:
class MyClass(object):
...
@needs_state
def some_function():
# do something
Run Code Online (Sandbox Code Playgroud)
现在,如果some_function()被调用,但self.state是None,错误将得到提升.我可以用装饰器完成这个 - 最好只用一个吗?(我已经看到使用类装饰器的解决方案,我不确定它做了我希望它做了什么!).奖金积分可以很好地解释为什么我不能;)
是的,装饰器是普通的功能,所以self规则也不例外.所以假设我写了一个装饰器函数,它接受一个名为的参数self:
def needs_state(fn):
def decorator(self, *args, **kwargs):
if self.state is None:
raise ValueError('Oh no')
return fn(self, *args, **kwargs)
return decorator
Run Code Online (Sandbox Code Playgroud)
它不知道是什么self,因为它不在一个类中,但没关系,你可以按照你期望的方式在类中使用装饰器.
class MyClass(object):
def __init__(self, state=None):
self.state = state
@needs_state
def some_function(self):
print self.state
Run Code Online (Sandbox Code Playgroud)
所以,如果您现在用任何东西实例化该类,您some_function将首先检查是否self.state为none,因为您刚装饰它.同样,如果类没有状态,则会按预期引发异常.
MyClass(1).some_function() # 1
MyClass(None).some_function() # raises
Run Code Online (Sandbox Code Playgroud)
self.process 被遗漏,所以你需要做一些工作.