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

