乐于分享
好东西不私藏

Python 面向对象习题(5/10)

Python 面向对象习题(5/10)

本文首发于微信公众号「拙见python」,基础板块第 8 篇。
适合人群:已阅读第 2 篇:Python 面向对象编程并动手敲过代码的读者。
题目难度:⭐ → ⭐⭐⭐⭐⭐ 逐步提升,建议先自己写,再看答案。


做题须知

  • 每道题标注了考察知识点难度星级
  • 先自己写,写不出来再看答案
  • 答案不是唯一的,能跑通且逻辑正确就行
  • 每道题答案下方附有思路解析

第 5 题:动物王国继承体系 ⭐⭐⭐

考察知识点:单继承、super()、方法重写、isinstance()

定义一个动物继承体系:

  1. 基类 Animal:有 nameage 属性,speak() 方法返回通用声音,info() 方法返回动物信息
  2. 子类 Dog:新增 breed(品种)属性,重写 speak() 返回「汪汪」,重写 info() 包含品种信息
  3. 子类 Cat:新增 color(颜色)属性,重写 speak() 返回「喵喵」,新增 purr() 方法
  4. 子类 Puppy(继承 Dog:重写 speak() 返回「呜呜(小奶狗)」,调用 super() 复用父类 info()

创建各类实例,测试 speak()info()isinstance()

参考答案:

class Animal:    def __init__(self, name, age):        self.name = name        self.age = age    def 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 = breed    def 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 = color    def 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 → Animal        return 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 的实例。

    建议的练习方式

    1. 先自己写——不看答案,能写多少写多少

    2. 卡住了回看文章——第 2 篇对应章节有完整示例

    关注「拙见python」,一起写干净的代码。


    下一篇预告:Python 面向对象习题之6/10