Python中如何绕过子类__init__为父类传参,且子类初始化时可访问
问题背景与需求
我开发的库中提供了基类Task:
class Task: def __init__(self, additional_arg1 = None, additional_arg2 = None): # 注册参数 self.additional_arg1 = additional_arg1 self.additional_arg2 = additional_arg2
用户会继承这个类实现自定义子类MyTask,示例如下:
class MyTask(Task): def __init__(self, *user_args, **user_kwargs): super().__init__() # 注册用户自定义参数 ...
我需要在库内部实例化MyTask时,把额外的任务参数传递并注册到Task.__init__中,且不需要经过MyTask.__init__方法。
当前实现的问题
目前我是通过实例化后动态赋值的方式实现:
# 以下是库内部逻辑:用户提供了MyTask类和他的输入参数,我需要把Task接口中定义的额外参数动态添加进去 task = MyTask(*user_args, **user_kwargs) task.additional_arg1 = additional_arg1 task.additional_arg2 = additional_arg2
但这种方式下,用户在MyTask.__init__中无法访问这些属性——因为它们是实例化完成后才被赋值的。
核心需求
我希望做到:
- 不需要用户修改
MyTask.__init__的签名来传递额外参数 - 用户仍能在
MyTask.__init__中访问这些额外属性
我曾经用全局变量实现了这个需求,但想找不依赖全局变量的更优方案。全局变量的实现示例如下:
from typing import Dict A = None B = None def set_args(a, b): global A global B A = a B = b class Task: """库中实现的基类Task""" def __init__(self): self.a = A # 从全局变量中读取并设置额外属性 self.b = B @classmethod def from_cfg(cls, task_class: type, cfg: Dict): set_args(a=5, b=6) # 将额外参数注册为全局变量 return task_class(**cfg) # 实例化用户的MyTask,同时在Task.__init__中读取全局变量完成属性注册 class MyTask(Task): """用户实现的自定义任务类 额外属性a和b应该在__init__中就能访问,不需要用户把它们作为__init__的输入参数 """ def __init__(self, c, d): super().__init__() self.c = c self.d = d print(self.a) # 现在可以正常输出5,而不是None def run(self): pass def main(): my_task = Task.from_cfg(MyTask, {"c": 1, "d": 2}) print(my_task.a) # 输出5 if __name__ == "__main__": main()
核心目标是:在Task.from_cfg中注册额外参数,让这些参数在MyTask.__init__中可用,且无需作为常规参数传递给MyTask.__init__。
内容的提问来源于stack exchange,提问作者hokage555
相关产品推荐
相关产品推荐

