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

