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

Python如何重写父类方法并保留原有签名、文档字符串与类型提示

问题描述

现有Python代码框架如下:

class Mammal:
    def __init__(self, age: int, name: str):
        """ This is a mammal"""
        self.age = age
        self.name = name
        
class Human(Mammal):
    # 需要重写Mammal的__init__,同时保留原有签名
    def __init__(self, ???):
        super().__init__()
        self.job = job

需求为输入Human(<Tab>时,编辑器能自动展开Mammal类__init__的签名提示,同时满足:

  • 不使用def __init__(self, *args, **kwargs)的写法(会丢失原方法的签名与文档字符串)
  • 不需要手动完整复写父类__init__参数(避免父类签名修改时子类同步修改的维护成本)
解决方案

方案1:使用dataclass(标准库,维护成本最低)

如果可以改造父类为数据类,是当前场景的最优解,继承时会自动合并父类与子类的字段,不需要手写__init__方法:

from dataclasses import dataclass

@dataclass
class Mammal:
    age: int
    name: str
    """这是哺乳动物类"""

@dataclass
class Human(Mammal):
    job: str

此时输入Human(<Tab>,编辑器会自动提示age、name、job三个参数,父类新增/修改字段时子类无需任何修改即可同步生效,文档字符串也会自动继承。

方案2:使用makefun库(兼容旧Python版本,提示最稳定)

如果不能改造原有类结构,可以用第三方库makefun的wraps装饰器,完美复制父类方法的签名、文档字符串,同时支持添加子类的自定义参数:

from makefun import wraps

class Mammal:
    def __init__(self, age: int, name: str):
        """ This is a mammal"""
        self.age = age
        self.name = name

class Human(Mammal):
    @wraps(Mammal.__init__)
    def __init__(self, *args, job: str, **kwargs):
        super().__init__(*args, **kwargs)
        self.job = job

父类__init__签名修改时,子类不需要做任何调整,编辑器会自动同步最新的参数提示。

方案3:标准库ParamSpec实现(无第三方依赖)

Python 3.10及以上版本可以使用标准库的ParamSpec实现签名继承,无需安装第三方依赖:

from typing import ParamSpec, TypeVar
from functools import wraps

P = ParamSpec("P")
T = TypeVar("T", bound=Mammal)

def inherit_init_signature(func: callable[P, None]) -> callable[P, None]:
    @wraps(func)
    def wrapper(self: T, *args: P.args, **kwargs: P.kwargs) -> None:
        return func(self, *args, **kwargs)
    return wrapper

class Mammal:
    def __init__(self, age: int, name: str):
        """ This is a mammal"""
        self.age = age
        self.name = name

class Human(Mammal):
    @inherit_init_signature(Mammal.__init__)
    def __init__(self, *args, job: str, **kwargs):
        super().__init__(*args, **kwargs)
        self.job = job

VSCode、PyCharm等现代编辑器都可以正确识别该方案的参数提示。

注意事项
  • 优先选dataclass方案,不需要额外引入依赖或装饰器,长期维护成本最低
  • 需要兼容Python 3.9及以下版本时,makefun方案对编辑器提示的兼容性最好
  • ParamSpec标准库方案仅支持Python 3.10及以上版本,部分老旧编辑器可能存在识别异常

内容的提问来源于stack exchange,提问作者0xF4D3C0D3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:45:03