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

Python子类继承父类方法时如何单独修改追加docstring不影响父类

问题根因

直接修改ChildClass.return_x.__doc__会同步改动父类文档,核心原因是:子类未重写继承方法时,ChildClass.return_x和ParentClass.return_x指向同一个函数对象,对该对象属性的修改会全局生效,所有引用这个函数的类都会看到变更。

实现方案

使用标准库functools.wraps做一层无额外逻辑的薄包装即可,既不需要重写方法内部实现、复制原有长文档,也不会对父类造成任何影响:

import functools

class ParentClass:
    def __init__(self):
        """Init docstring"""
        self.x = 1

    def return_x(self):
        """Will return 1"""
        return self.x

class ChildClass(ParentClass):
    def __init__(self):
        self.x = 2

# 为子类单独绑定独立的包装方法,和父类方法完全隔离
@functools.wraps(ParentClass.return_x)
def return_x(self):
    return ParentClass.return_x(self)

# 支持原文档基础上追加内容,也可以全量替换
return_x.__doc__ = f"{ParentClass.return_x.__doc__}\n注意:本类实例调用该方法将返回2"
ChildClass.return_x = return_x

如果有多个方法需要修改文档,可以封装简单的工具函数减少重复代码:

def append_method_doc(parent_cls, method_name, append_text):
    origin_func = getattr(parent_cls, method_name)
    @functools.wraps(origin_func)
    def wrapper(*args, **kwargs):
        return origin_func(*args, **kwargs)
    wrapper.__doc__ = f"{origin_func.__doc__}\n{append_text}"
    return wrapper

# 调用示例
ChildClass.return_x = append_method_doc(ParentClass, "return_x", "注意:本类实例调用该方法将返回2")

效果验证

# 父类文档完全不受影响
>>> help(ParentClass.return_x)
Help on function return_x in module __main__:

return_x(self)
    Will return 1

# 子类文档为追加后的独立内容
>>> help(ChildClass.return_x)
Help on function return_x in module __main__:

return_x(self)
    Will return 1
    注意:本类实例调用该方法将返回2

方案优势

  • 对父类原方法、原文档无任何侵入,父子类方法文档完全隔离
  • 无需手动复制复杂方法签名、原有长文档,functools.wraps会自动同步原方法的所有元信息(包括参数签名、类型注解等)
  • 包装层仅做透传调用,无额外运行时开销,方法执行逻辑和父类原逻辑完全一致
  • 文档修改灵活,支持全量替换、原文追加等任意调整需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:18:42