关于python:方法调用前检查条件

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,并且无论它返回什么,都会用它来代替函数。因此,即使您的started装饰器没有通过尝试访问函数的_started属性而抛出AttributeError,它也会返回None,使您的所有方法都设置为None,因此甚至不可调用。

你想要的是这样的:

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

几乎所有的修饰符都是这种形式的;它们接受一个函数,创建一个包装器来"环绕"接收到的函数,然后返回包装器。如果您最终在交互式解释器会话中使用此代码,那么使用functools.wraps会很方便;它会自动使用原始函数的名称和docstring更新wrapper函数,从而使修饰后的函数看起来更像原始函数。

不管这个是否在类中定义,这都无关紧要。