gpt4 book ai didi

python - 方法调用前检查条件

转载 作者:太空狗 更新时间:2023-10-30 00:51:34 24 4
gpt4 key购买 nike

我有一个名为 Server 的类,它可以启动和停止。除非服务器已启动,否则不应调用某些方法,在这种情况下,应引发 NotConnectedException。有没有办法在类中的每个方法之前调用一个方法,并确定类变量 _started 是否设置为 True?

我尝试使用装饰器,但装饰器函数无法访问类变量。我试图做这样的事情:

class Server(object):
_started = False
def started(self):
if(self._started == False):
raise NotConnectedException

@started
def doServerAction(self):
...

最佳答案

记住什么是装饰器:

@decorate
def foo(...):
...

完全等同于:

def foo(...):
...
foo = decorate(foo)

装饰器是在函数 上调用的,因此调用第一个参数self 是没有意义的。此外,装饰器在函数定义时被调用,并且它返回的任何内容都用于代替函数。因此,即使您的 started 装饰器没有通过尝试访问函数的 _started 属性而抛出 AttributeError,它也会返回 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

几乎所有的装饰器都是这种形式;他们接受一个函数,创建一个包装器来“围绕”接收到的函数做一些事情,然后返回包装器。如果您最终在交互式解释器 session 中使用此代码,那么此处使用 functools.wraps 会很方便;它会使用原始函数的名称和文档字符串自动更新 wrapper 函数,这使得修饰后的函数“看起来”更像原始函数。

这是否在类内部定义是无关紧要的。

关于python - 方法调用前检查条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10904521/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com