继承(inheritance)让子类获得父类已经定义的属性和方法,并在此基础上增加或改变行为。它适合稳定的“是一种”(is-a)关系:Food 是一种 Product,Drink 也是一种 Product。父类保存真正共有的部分,子类只描述差异,从而避免重复。
生活中,交通工具可以提供品牌和移动行为;自行车补充踏板,汽车补充发动机。继承并不表示把父类对象复制一遍,而是建立类型关系:寻找方法时,Python 会先看当前子类,找不到再沿继承链向父类查找。
父类构造与子类扩展
互动实验
继承装配线:父类部分流向子类
访问权限PRO
PRO EXCLUSIVE探索不止于此
尊享 Pro 权益解锁完整互动实验、进阶解析与精选参考答案。
class Product:
def __init__(self, name, price):
self.__name = name
self.__price = price
def get_name(self):
return self.__name
def get_price(self):
return self.__price
class Food(Product):
def __init__(self, name, price, calories):
super().__init__(name, price)
self.__calories = calories
class Drink(Product):
def __init__(self, name, price, size):
super().__init__(name, price)
self.__size = size知识测验
题目
Food(Product) 表达什么关系?
知识测验
题目
super().__init__(name, price) 的作用是什么?
重写与方法查找
子类定义一个与父类同名的方法,就是方法重写(override)。调用 food.__str__() 时,Python 优先使用 Food 的版本。子类版本仍可通过 super().__str__() 调用父类实现,这适合“保留公共结果,再添加细节”。
class Product:
def __init__(self, name, price):
self.__name = name
self.__price = price
def __str__(self):
return "%s (%.2f)" % (self.__name, self.__price)
class Food(Product):
def __init__(self, name, price, calories):
super().__init__(name, price)
self.__calories = calories
def __str__(self):
return "Food: %s, %d kcal" % (super().__str__(), self.__calories)
food = Food("Cheeseburger", 5.45, 302)
print(food)互动实验
汉堡店对象厨房:父类配方 + 子类配料
访问权限PRO
PRO EXCLUSIVE探索不止于此
尊享 Pro 权益解锁完整互动实验、进阶解析与精选参考答案。
知识测验
题目
子类重新定义 __str__() 叫什么?
知识测验
题目
重写方法里为什么还会调用 super().__str__()?
动手练习
让电子书继承产品
- Product 保存 name 和 price。
- EBook(Product) 增加 file_size。
- 使用 super().__init__ 初始化共有字段。
- 打印三个字段。
动手练习
重写通知方法
- Notification.send() 返回通用消息。
- EmailNotification 和 SMSNotification 继承它。
- 分别重写 send(),返回带渠道名称的消息。
- 各创建一个对象并调用。
动手练习
扩展餐厅菜单模型
- 建立 Product(name, price) 和 __str__。
- Food 增加 calories,Drink 增加 size。
- 两个子类都调用 super().__init__ 并重写 __str__。
- 创建至少两个 Food 和两个 Drink,逐个打印。