子类重写父类方法需兼顾契约遵守与行为定制:完全替代不调用父类,补充增强用super()追加逻辑,条件调整则在父类基础上分支处理;必须保持参数签名、返回类型一致,优先使用protected或public方法供重写。

子类重写父类方法不是简单覆盖,而是有策略地增强或调整行为——关键在于“保留父类逻辑”+“注入子类定制”。
明确重写的意图:替换、补充还是条件性修改?
重写前先问自己:是要完全替代父类行为?还是在父类基础上加点新东西?又或者只在特定条件下改变逻辑?不同意图对应不同写法。
- 完全替代:直接定义同名方法,不调用父类(如 Dog.speak() 完全不用 Animal.speak())
- 补充增强:用 super() 调用父类方法,再追加子类逻辑(如初始化后额外设置 breed 属性)
- 条件性调整:先执行父类逻辑,再根据子类状态做分支处理(如日志记录后,仅对 VIP 用户发送通知)
用 super() 保持调用链清晰
super() 不是可选技巧,而是维持继承体系健壮性的核心工具。尤其在多层继承或多重继承中,它按 MRO 顺序自动找到下一个类,避免硬编码父类名带来的耦合和错误。
- 构造函数里务必用 super().__init__(),确保所有父类初始化逻辑被触发
- 普通方法中调用 super().method_name(),可复用父类校验、日志、清理等通用逻辑
- 注意:super() 返回的是“下一个类”的代理对象,不是当前类的父类本身
重写时保留接口契约
父类方法的参数签名、返回类型和异常约定,是子类必须尊重的契约。随意增删参数或改变返回值类型,会破坏多态性,让依赖父类的代码出错。
- 若需新增参数,可用 **kwargs 或默认参数兼容旧调用方式
- 若逻辑变更导致返回结构不同,考虑封装新方法,而非强行扭曲原方法语义
- 文档字符串建议注明“扩展了父类 behavior”,方便协作者理解差异
避免隐式覆盖:私有方法与双下划线属性
Python 中以双下划线开头的方法(如 __helper())会被名称改写(name mangling),子类无法直接重写——这不是设计缺陷,而是提示:“这个方法属于父类内部实现细节,请勿干扰”。真正需要定制的,应设计为受保护方法(单下划线 _helper)或公开方法。
- 想让子类可重写?把方法设为 public(如 helper())或 protected(如 _helper())
- 子类中定义同名 __xxx 方法,实际创建的是独立方法,与父类无继承关系
- 调试时可通过 obj._ParentClass__helper 访问,但不推荐用于重写场景











