Python中如何让父类的配置初始化操作仅执行一次?
Python中实现共享配置仅初始化一次的最佳实践
针对你遇到的多个子类共享同一配置、希望配置仅初始化一次的需求,这里给你几种实用的实现方式:
方法一:直接定义类变量初始化
如果配置可以在类加载时直接获取,直接把cfg作为TaskInput的类属性定义,类加载时只会执行一次初始化,所有子类和实例都会共享这个值:
class TaskInput: # 类加载时仅执行一次初始化,所有子类共享该配置 cfg = my_config class TaskA(TaskInput): def __init__(self): pass class TaskB(TaskInput): def __init__(self): pass
方法二:延迟初始化(适合需按需加载的场景)
如果配置不能在类加载时立即初始化(比如需要依赖其他运行时数据),可以用类方法实现延迟加载,确保第一次调用时才初始化,后续直接复用:
class TaskInput: _cfg = None # 私有类变量,存储已初始化的配置 @classmethod def get_cfg(cls): if cls._cfg is None: # 仅第一次调用时执行初始化逻辑 cls._cfg = my_config return cls._cfg class TaskA(TaskInput): def __init__(self): # 初始化实例属性,复用类变量的配置 self.cfg = self.get_cfg() class TaskB(TaskInput): def __init__(self): self.cfg = self.get_cfg()
后续在代码中也可以直接通过TaskInput.get_cfg()或者实例的self.get_cfg()获取配置,不用每次实例化都重复初始化。
方法三:利用__init_subclass__(Python 3.6+)
如果需要在子类定义阶段就确保配置已初始化,可以用__init_subclass__钩子,它会在每个子类被定义时触发,我们只在第一次触发时初始化配置:
class TaskInput: cfg = None def __init_subclass__(cls, **kwargs): super().__init_subclass__(**kwargs) # 仅当全局配置未初始化时执行 if TaskInput.cfg is None: TaskInput.cfg = my_config class TaskA(TaskInput): def __init__(self): pass class TaskB(TaskInput): def __init__(self): pass
注意事项
- 如果配置初始化是耗时操作(比如读取大文件、远程请求),优先选择类变量直接初始化或延迟加载,避免重复执行开销。
- 类变量是全局共享的,修改
TaskInput.cfg会影响所有子类和实例,适合确实需要唯一全局配置的场景。
内容的提问来源于stack exchange,提问作者shadyabhi
相关产品推荐
相关产品推荐

