Skip to content

【练习】动物园

项目简介

动物园系统

知识模块

  • Python 编程语言

知识点

  • 实例方法
  • 实例属性
  • 类属性
  • 构造方法
  • 封装
  • 继承
  • 多态

受众

  • 初级测试开发工程师
  • 初级Python开发工程师

作业要求

设计一个简单的动物园系统,其中包含不同类型的动物(如狗、猫和鸟)。每个动物都有自己的属性(如名字、年龄)和行为(如发出声音)。使用封装、继承和多态来完成。

解题思路

  1. 创建一个动物基类,其中包含一些共同的属性(如名字、年龄)和方法(如发出声音)。定义构造函数 init 和发声方法。

  2. 创建子类(每种动物),分别继承自基类。

  3. 在每个子类中,可以定义不同的属性和重写发声方法。

  4. 创建函数来实例化不同类型的动物,并调用它们的方法。

完整代码

class Animal:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def make_sound(self):
        pass


# 定义 Dog 子类
class Dog(Animal):
    def __init__(self, name, age):
        super().__init__(name, age)

    def make_sound(self):
        print(f"{self.name} 发出汪汪叫声!")


# 定义 Cat 子类
class Cat(Animal):
    def __init__(self, name, age):
        super().__init__(name, age)

    def make_sound(self):
        print(f"{self.name} 发出喵喵叫声!")


# 定义 Bird 子类
class Bird(Animal):
    def __init__(self, name, age):
        super().__init__(name, age)

    def make_sound(self):
        print(f"{self.name} 发出鸟叫声!")


# 创建动物对象并调用方法
dog = Dog("狗狗", 3)
cat = Cat("猫咪", 2)
bird = Bird("小鸟", 1)

dog.make_sound()
cat.make_sound()
bird.make_sound()

代码讲解

  1. 定义父类

    class Animal:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def make_sound(self):
            pass
    
    • 这部分定义了一个基类 Animal,其中包含了构造函数 __init__,该构造函数接收动物的名字和年龄作为参数,并将它们存储为对象属性。还定义了一个未实现的 make_sound 方法,它在基类中只是一个占位符方法。
  2. 定义子类

    class Dog(Animal):
        def __init__(self, name, age):
            super().__init__(name, age)
    
        def make_sound(self):
            print(f"{self.name} 发出汪汪叫声!")
    

    - 这部分定义了 Dog 子类,它继承自基类 Animal。它的构造函数使用 super().__init__来调用基类的构造函数,从而初始化继承的属性。make_sound 方法被重写,实现了狗叫的功能。

    - Cat 子类和 Bird 子类与 Dog 子类类似

  3. 实例对象

    dog = Dog("狗狗", 3)
    cat = Cat("猫咪", 2)
    bird = Bird("小鸟", 1)
    
    dog.make_sound()
    cat.make_sound()
    bird.make_sound()
    

    - 实例化了不同类型的动物对象,即 dogcatbird。然后,调用了它们的 make_sound 方法,由于多态性的存在,实际上调用了每个子类中不同的 make_sound 方法,分别输出不同的叫声。