Python 继承深度解析 —— 从 __base__ 到 super() 的完整实践

📅 2026/8/4 3:18:39
Python 继承深度解析 —— 从 __base__ 到 super() 的完整实践
前言继承是面向对象编程OOP的三大特性之一它允许子类复用父类的属性和方法从而实现代码的复用与扩展。在 Python 中一切类默认都是object的子类。本文将结合一段完整的代码示例深入剖析 Python 继承的核心概念包括__base__/__bases__的用法、super()调用父类方法、以及__str__与__repr__在继承中的重写实践。一、继承的基本概念在 Python 中继承的语法非常简洁class 父类: pass class 子类(父类): pass父类基类、超类被继承的类子类继承父类的类我们可以通过两个特殊属性来查看类的父类信息属性说明类名.__base__获取单个父类类名.__bases__获取父类元组class Person(object): pass print(Person.__base__) # class object print(Person.__bases__) # (class object,)二、从简单继承开始我们先定义一个Person类包含姓名和年龄属性以及get_info方法class Person(object): def __init__(self, name, age): self.name name self.age age def get_info(self): return fname:{self.name}, age:{self.age}Person类默认继承自object拥有所有对象的基本行为。三、子类继承与super()调用父类现在定义一个SuperPerson子类在父类的基础上增加skill属性class SuperPerson(Person): def __init__(self, name, age, skill): super().__init__(name, age) # 调用父类的 __init__ self.skill skill def get_info(self): return f{super().get_info()}, skill:{self.skill}这里的关键是super()super()返回一个代理对象用于调用父类的方法super().__init__(name, age)调用了父类Person的构造函数完成name和age的初始化super().get_info()调用了父类的get_info方法在此基础上追加子类的skill信息为什么要用super()在单继承中直接使用父类名调用如Person.__init__(self, name, age)也可以工作。但在多重继承中super()会遵循MRO方法解析顺序规则避免重复调用和钻石继承问题。因此推荐始终使用super()即使是在单继承场景中。四、重写__str__与__repr____str__和__repr__是 Python 中用于定义对象字符串表示的两个魔术方法方法面向对象调用时机__str__最终用户print()、str()、format()__repr__开发者repr()、控制台直接输出、调试重要规则如果没有定义__str__Python 会回退调用__repr__。父类中定义class Person(object): def __str__(self): return Person def __repr__(self): return Person()测试输出p1 Person(马克思, 20) print(p1, [p1]) # Person [Person()]print(p1)调用__str__输出Person列表展示时调用__repr__输出Person()子类中重写并复用父类class SuperPerson(Person): def __str__(self): return fSuper{super().__str__()} def __repr__(self): return fSuper{super().__repr__()}这里通过super()调用了父类的__str__和__repr__并在其基础上添加了Super前缀sp1 SuperPerson(绿巨人, 30, 变身) print(sp1, [sp1]) # SuperPerson [SuperPerson()]这样做的好处是复用父类逻辑避免重复编码保持一致性子类的字符串表示在父类基础上扩展易于维护父类逻辑变更时子类自动同步五、完整代码回顾class Person(object): def __init__(self, name, age): self.name name self.age age def __str__(self): return Person def __repr__(self): return Person() def get_info(self): return fname:{self.name}, age:{self.age} class SuperPerson(Person): def __init__(self, name, age, skill): super().__init__(name, age) self.skill skill def __str__(self): return fSuper{super().__str__()} def __repr__(self): return fSuper{super().__repr__()} def get_info(self): return f{super().get_info()}, skill:{self.skill}六、总结知识点要点__base__/__bases__查看类的父类信息super()调用父类方法支持 MRO推荐优先使用__str__vs__repr____str__面向用户__repr__面向开发者继承中的方法重写使用super()复用父类逻辑保持代码 DRY继承让代码复用变得简单而super()则是让继承变得优雅的关键工具。掌握这些基础你就能在 Python 面向对象编程中游刃有余。