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
相关产品推荐
相关产品推荐

