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

Python如何从私有装饰器方法内设置BaseCLS的credentials类变量

问题原因
  • 你当前直接在__init_session内写credentials = utils.get_creds(),创建的是函数局部变量,不会修改BaseCLS的类变量
  • 现有装饰器逻辑错误:没有返回包装函数,只会在类定义阶段执行一次,不会在每次process调用时触发执行
  • 装饰器顺序错误:@staticmethod需要放在自定义装饰器的上层,否则静态方法的特性会失效
修复后的完整代码
from abc import ABC, abstractmethod
from main_module import utils


class BaseCLS(ABC):
    credentials = None 

    def __init_session(func):
        # 定义包装函数,每次调用被装饰方法时先执行初始化逻辑
        def wrapper(*args, **kwargs):
            # 可选:添加判断避免重复调用接口获取凭证
            if not BaseCLS.credentials:
                # 显式指定修改BaseCLS的类变量credentials
                BaseCLS.credentials = utils.get_creds()
            return func(*args, **kwargs)
        return wrapper

    @staticmethod
    @__init_session
    def process(path: str) -> None:
        raise NotImplementedError
适配子类扩展的调整方案

如果你需要支持子类单独维护自己的credentials变量,可以把process改为类方法,调整如下:

from abc import ABC, abstractmethod
from main_module import utils


class BaseCLS(ABC):
    credentials = None 

    def __init_session(func):
        def wrapper(cls, *args, **kwargs):
            if not cls.credentials:
                cls.credentials = utils.get_creds()
            return func(cls, *args, **kwargs)
        return wrapper

    @classmethod
    @__init_session
    def process(cls, path: str) -> None:
        raise NotImplementedError

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:36:03