Check condition before method call
我有一个名为server的类,它可以启动和停止。除非启动服务器,否则不应调用某些方法,在这种情况下,应引发NotConnectedException。是否有方法在类中的每个方法之前调用一个方法,并确定类变量started是否设置为true?
我尝试使用decorator,但decorator函数不能访问类变量。我试着这样做:
1 2 3 4 5 6 7 8 9 | class Server(object): _started = False def started(self): if(self._started == False): raise NotConnectedException @started def doServerAction(self): ... |
记住什么是装饰师:
1 2 3 | @decorate def foo(...): ... |
完全等同于:
1 2 3 | def foo(...): ... foo = decorate(foo) |
在函数上调用decorator,因此调用第一个参数self没有意义。另外,当定义了decorator时,会对函数调用decorator,并且无论它返回什么,都会用它来代替函数。因此,即使您的
你想要的是这样的:
1 2 3 4 5 6 7 8 9 10 | import functools def started(func): @functools.wraps(func) def wrapper(self, *args, **kwargs): if not self._started: raise ... else: return func(self, *args, **kwargs) return wrapper |
几乎所有的修饰符都是这种形式的;它们接受一个函数,创建一个包装器来"环绕"接收到的函数,然后返回包装器。如果您最终在交互式解释器会话中使用此代码,那么使用
不管这个是否在类中定义,这都无关紧要。