你用过手机壳吧?买个新壳,不用换手机,就能换个颜色、加个支架,甚至防摔升级——壳本身不单独工作,但它能复用手机的所有功能,还能额外加点新东西。类继承,差不多就是这个理儿。
继承不是复制粘贴,是“接着往下写”
在编程里,比如 Python 或 Java,一个“父类”(也叫基类)定义了通用功能:比如 Animal 类有 eat() 和 sleep() 方法;而 Dog 类继承 Animal,就自动有了这两个方法,不用重写一遍。它还能自己加个 bark():
class Animal:
def eat(self):
print("正在吃东西")
class Dog(Animal): # Dog 继承 Animal
def bark(self):
print("汪汪!")运行 my_dog = Dog(); my_dog.eat(); my_dog.bark(),输出就是:
正在吃东西
汪汪!
为啥故障排查时得懂这个?
很多报错看着吓人,比如 AttributeError: 'Car' object has no attribute 'fly'。你一查发现 Car 是从 Vehicle 继承来的,但 fly() 其实只写在 Airplane 类里——这说明你误把两个不同子类的方法混用了。继承关系理清了,错误源头立马浮现。
还有种常见情况:改了父类的 __init__,结果所有子类创建对象都报错。这不是代码崩了,是继承链断了——子类没显式调用 super().__init__(),父类初始化逻辑根本没跑。
小提醒:继承不是万能胶
别啥都往上套。比如给 Button 类硬塞个 calculateInterest() 方法,就算语法没错,逻辑上也拧巴。继承讲的是“is-a”关系:狗是一种动物,不是“按钮是一种利息计算器”。乱继承,后期修 bug 能让你怀疑人生。
下次看到报错信息里带“object has no attribute”或“super() not called”,先画两笔类图,标出谁继承谁——问题常常就卡在这条线上。