我有一个名为Server的类,可以启动和停止.除非启动服务器,否则不应调用某些方法,在这种情况下应引发NotConnectedException.有没有办法在类中的每个方法之前调用方法,并确定类变量_started是否设置为True?
我尝试使用装饰器,但装饰器函数无法访问类变量.我试图做这样的事情:
class Server(object):
_started = False
def started(self):
if(self._started == False):
raise NotConnectedException
@started
def doServerAction(self):
...
Run Code Online (Sandbox Code Playgroud)
记住装饰者是什么:
@decorate
def foo(...):
...
Run Code Online (Sandbox Code Playgroud)
完全等同于:
def foo(...):
...
foo = decorate(foo)
Run Code Online (Sandbox Code Playgroud)
在函数上调用装饰器,因此调用第一个参数self是没有意义的.此外,在定义函数时调用函数,并且使用它返回的任何函数代替函数.因此,即使您的started装饰器没有AttributeError通过尝试访问_started函数的属性而抛出它,它将返回None,使您的所有方法都设置为None,因此甚至不可调用.
你想要的是这样的:
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
Run Code Online (Sandbox Code Playgroud)
几乎所有装饰者都是这种形式; 他们接受一个函数,创建一个包装器,它在接收函数周围做一些事情,然后返回包装器.functools.wraps如果您最终在交互式解释器会话中使用此代码,则使用此处是一种便利; 它wrapper使用原始函数的名称和docstring 自动更新函数,这使得装饰函数"看起来像"原始函数更多.
这是否在课堂内定义是无关紧要的.
| 归档时间: |
|
| 查看次数: |
1112 次 |
| 最近记录: |