You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Client类__init__存储_token实现令牌缓存的原理

Client类令牌复用逻辑运行原理

这是非常典型的实例级懒加载缓存写法,运行逻辑非常直白:

  • 初始化阶段:创建Client实例的时候,__init__方法会自动给当前实例绑定一个_token属性,初始值设为None,相当于打个标记:当前还没获取过有效令牌。
  • 令牌获取分支逻辑:每次调用get_json_response发业务请求时,都会先走_get_token()拿令牌,这处判空逻辑会把执行路径拆成两种:
    第一次调用_get_token()时,self._token还是初始的None,if self._token is not None判断不成立,不会进入if分支,会正常往下走申请令牌的流程:发请求拿到接口返回的token后,把这个token赋值给self._token存在实例属性上,再返回给业务方法使用。
    后续不管调用多少次_get_token(),self._token里已经存了第一次拿到的有效token,值不再是None,判空条件直接命中,立刻返回之前缓存好的token,根本不会执行后面发网络请求申请新令牌的代码,自然就实现了令牌复用、避免重复申请的效果。

补充说明:这个缓存的生效范围是单个Client实例。如果重新实例化一个新的Client对象,新对象的_token会被重新初始化为None,第一次使用时还是会重新申请令牌;同一个Client实例从创建到销毁的整个生命周期里,只会主动申请一次令牌。

对应实现代码如下:

class Client:

    def __init__(self):
        self._token = None

    def _get_token(self):
        if self._token is not None:
            return self._token

        response = requests.post("url", json="params", headers="headers")
        token = response.json()['token']
        self._token = token
        return token

    def get_json_response(self, endpoint, params):
        token = self._get_token()
        request_headers = self._get_default_headers(token)

        response = requests.post(url, json=params, headers=request_headers)

内容的提问来源于stack exchange,提问作者KristiLuna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 17:57:34