
本文首发于微信公众号「拙见python」,基础板块第 8 篇。
适合人群:已阅读第 2 篇:Python 面向对象编程并动手敲过代码的读者。
题目难度:⭐ → ⭐⭐⭐⭐⭐ 逐步提升,建议先自己写,再看答案。
做题须知
每道题标注了考察知识点和难度星级 先自己写,写不出来再看答案 答案不是唯一的,能跑通且逻辑正确就行 每道题答案下方附有思路解析
第 5 题:动物王国继承体系 ⭐⭐⭐
考察知识点:单继承、super()、方法重写、isinstance()
定义一个动物继承体系:
基类 Animal:有name、age属性,speak()方法返回通用声音,info()方法返回动物信息子类 Dog:新增breed(品种)属性,重写speak()返回「汪汪」,重写info()包含品种信息子类 Cat:新增color(颜色)属性,重写speak()返回「喵喵」,新增purr()方法子类 Puppy(继承Dog):重写speak()返回「呜呜(小奶狗)」,调用super()复用父类info()创建各类实例,测试
speak()、info()、isinstance()。
参考答案:
class Animal:def __init__(self, name, age):self.name = nameself.age = agedef speak(self):return f”{self.name} 发出了声音”def info(self):return f”名字:{self.name},年龄:{self.age}岁”class Dog(Animal):def __init__(self, name, age, breed):super().__init__(name, age)# 调用父类构造方法self.breed = breeddef speak(self):return f”{self.name} 汪汪叫!”def info(self):# 复用父类 info(),再追加品种信息return super().info() + f”,品种:{self.breed}”class Cat(Animal):def __init__(self, name, age, color):super().__init__(name, age)self.color = colordef speak(self):return f”{self.name} 喵喵叫~”def purr(self):return f”{self.name}({self.color})呼噜呼噜...”def info(self):return super().info() + f”,颜色:{self.color}”class Puppy(Dog):def speak(self):return f”{self.name} 呜呜(小奶狗)”def info(self):# 多层 super():Puppy → Dog → Animalreturn super().info() + ”,幼犬”# 测试animals = [Dog(”旺财”, 3, ”金毛”),Cat(”橘子”, 2, ”橘色”),Puppy(”小奶”, 0, ”柯基”),]for a in animals:print(a.speak())print(a.info())print()# isinstance 测试puppy = Puppy(”小奶”, 0, ”柯基”)print(f”isinstance(puppy, Puppy): {isinstance(puppy, Puppy)}”)# Trueprint(f”isinstance(puppy, Dog): {isinstance(puppy, Dog)}”)# Trueprint(f”isinstance(puppy, Animal): {isinstance(puppy, Animal)}”)# Trueprint(f”isinstance(puppy, Cat): {isinstance(puppy, Cat)}”)# False
输出结果:
旺财 汪汪叫!名字:旺财,年龄:3岁,品种:金毛橘子 喵喵叫~名字:橘子,年龄:2岁,颜色:橘色小奶 呜呜(小奶狗)名字:小奶,年龄:0岁,品种:柯基,幼犬isinstance(puppy, Puppy): Trueisinstance(puppy, Dog): Trueisinstance(puppy, Animal): Trueisinstance(puppy, Cat): False
思路解析:
super().__init__(name, age) 调用父类构造方法初始化继承来的属性,子类只需初始化自己新增的属性(breed/color),避免重复代码。
super().info() 复用父类的 info() 返回值,在其基础上拼接子类信息——这是模板方法的雏形。
Puppy 继承 Dog,形成三层继承链Puppy → Dog → Animal,super() 会逐层向上查找。
isinstance() 沿继承链检查:Puppy 实例同时是 Puppy、Dog、Animal 的实例,但不是 Cat 的实例。
建议的练习方式:
先自己写——不看答案,能写多少写多少
卡住了回看文章——第 2 篇对应章节有完整示例
关注「拙见python」,一起写干净的代码。
下一篇预告:Python 面向对象习题之6/10
夜雨聆风