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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 14:50:28