Skip to content

📝 第8天:面向对象编程基础魔法练习 - 魔法师的实战训练场 ​

🎉 欢迎来到面向对象编程基础魔法的练习环节!通过前面的魔法课堂学习,我们已经掌握了咒语书(类)和魔法卷轴(对象)的基本概念,以及面向对象编程的四大高级魔法特性(封装、继承、多态和抽象)。现在是时候通过实战练习来巩固这些魔法知识了!

🎯 练习目标 ​

  • 掌握类的定义和对象的创建
  • 理解并使用实例变量和类变量
  • 熟练定义和调用实例方法
  • 理解封装的概念并能够应用
  • 掌握继承的实现和方法重写
  • 理解多态的概念并能够应用
  • 熟悉Python中的特殊方法

🏋️ 基础练习 ⭐⭐ (适合初学者) ​

这些练习将帮助你掌握面向对象编程的基础概念,每个练习都包含详细的示例代码和逐步指导。

1. 简单的类定义 ​

任务描述: 定义一个名为 Person 的类,包含以下内容:

  1. 初始化方法,接受姓名和年龄作为参数
  2. 一个显示个人信息的方法 display_info()
  3. 一个计算几年后年龄的方法 calculate_age_after_years(years)

示例代码:

python
# 定义Person类
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def display_info(self):
        print(f"姓名: {self.name}, 年龄: {self.age}")
    
    def calculate_age_after_years(self, years):
        return self.age + years

# 创建Person实例
person = Person("张三", 18)
person.display_info()
future_age = person.calculate_age_after_years(5)
print(f"5年后的年龄: {future_age}")

2. 类变量和实例变量 ​

任务描述: 定义一个名为 Employee 的类,包含以下内容:

  1. 一个类变量 company_name,值为 "ABC Company"
  2. 初始化方法,接受姓名、职位和工资作为参数
  3. 一个显示员工信息的方法 display_info()
  4. 一个类方法 change_company_name(new_name) 用于修改公司名称

示例代码:

python
class Employee:
    company_name = "ABC Company"  # 类变量
    
    def __init__(self, name, position, salary):
        self.name = name          # 实例变量
        self.position = position  # 实例变量
        self.salary = salary      # 实例变量
    
    def display_info(self):
        print(f"姓名: {self.name}")
        print(f"职位: {self.position}")
        print(f"工资: {self.salary}")
        print(f"公司: {self.company_name}")
    
    @classmethod
    def change_company_name(cls, new_name):
        cls.company_name = new_name

# 创建Employee实例
emp1 = Employee("张三", "软件工程师", 10000)
emp2 = Employee("李四", "产品经理", 12000)

# 显示员工信息
emp1.display_info()

# 修改公司名称
Employee.change_company_name("XYZ Corporation")

# 再次显示员工信息,验证公司名称是否已更新
emp2.display_info()

3. 封装练习 ​

任务描述: 定义一个名为 BankAccount 的类,实现以下功能:

  1. 初始化方法,接受账户名和初始余额(默认为0)
  2. 一个存款方法 deposit(amount)
  3. 一个取款方法 withdraw(amount),确保余额不小于0
  4. 一个获取余额的方法 get_balance()
  5. 使用私有属性来存储余额,防止直接修改

示例代码:

python
class BankAccount:
    def __init__(self, account_name, balance=0):
        self.account_name = account_name
        self.__balance = balance  # 私有属性
    
    def deposit(self, amount):
        if amount > 0:
            self.__balance += amount
            print(f"成功存入 {amount} 元。")
        else:
            print("存款金额必须大于0!")
    
    def withdraw(self, amount):
        if amount > 0:
            if amount <= self.__balance:
                self.__balance -= amount
                print(f"成功取出 {amount} 元。")
            else:
                print("余额不足!")
        else:
            print("取款金额必须大于0!")
    
    def get_balance(self):
        return self.__balance

# 测试BankAccount类
account = BankAccount("张三", 1000)
print(f"初始余额: {account.get_balance()}")
account.deposit(500)
print(f"存款后余额: {account.get_balance()}")
account.withdraw(200)
print(f"取款后余额: {account.get_balance()}")
account.withdraw(2000)  # 应该提示余额不足

🏋️ 中级练习 ⭐⭐⭐ (需要综合运用) ​

4. 继承练习 ​

任务描述: 定义一个基类 Animal 和两个派生类 Dog 和 Cat:

  1. Animal 类包含 name 属性和 eat() 方法
  2. Dog 类继承自 Animal,添加 breed 属性和 bark() 方法
  3. Cat 类继承自 Animal,添加 color 属性和 meow() 方法
  4. 在派生类中重写 eat() 方法以显示不同的信息

示例代码:

python
# 基类
class Animal:
    def __init__(self, name):
        self.name = name
    
    def eat(self):
        print(f"{self.name}正在吃东西。")

# 派生类 Dog
class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name)  # 调用基类的初始化方法
        self.breed = breed
    
    def eat(self):  # 重写基类方法
        print(f"{self.name}({self.breed})正在吃骨头。")
    
    def bark(self):
        print(f"{self.name}汪汪叫!")

# 派生类 Cat
class Cat(Animal):
    def __init__(self, name, color):
        super().__init__(name)
        self.color = color
    
    def eat(self):  # 重写基类方法
        print(f"{self.name}({self.color})正在吃鱼。")
    
    def meow(self):
        print(f"{self.name}喵喵叫!")

# 测试代码
dog = Dog("旺财", "拉布拉多")
cat = Cat("咪咪", "白色")

dog.eat()  # 应该调用Dog类的eat方法
dog.bark()

cat.eat()  # 应该调用Cat类的eat方法
cat.meow()

5. 特殊方法练习 ​

任务描述: 定义一个名为 Point 的类,实现以下功能:

  1. 初始化方法,接受 x 和 y 坐标
  2. 实现 __str__ 方法,返回点的字符串表示
  3. 实现 __add__ 方法,支持两个点的加法(坐标相加)
  4. 实现 __eq__ 方法,判断两个点是否相等
  5. 实现 __len__ 方法,返回点到原点的距离(取整)

示例代码:

python
import math

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __str__(self):
        return f"Point({self.x}, {self.y})"
    
    def __add__(self, other):
        return Point(self.x + other.x, self.y + other.y)
    
    def __eq__(self, other):
        return self.x == other.x and self.y == other.y
    
    def __len__(self):
        # 返回点到原点的距离(取整)
        return int(math.sqrt(self.x**2 + self.y**2))

# 测试Point类
p1 = Point(3, 4)
p2 = Point(1, 2)

print(p1)  # 应该调用__str__方法
p3 = p1 + p2  # 应该调用__add__方法
print(p3)  # 应该输出Point(4, 6)

print(p1 == p2)  # 应该调用__eq__方法,输出False
p4 = Point(3, 4)
print(p1 == p4)  # 应该调用__eq__方法,输出True

print(len(p1))  # 应该调用__len__方法,输出5(因为3²+4²=5²)

🚀 挑战练习 ⭐⭐⭐⭐ (适合进阶学习者) ​

这些挑战练习需要综合运用面向对象编程的多个概念,是对编程思维的真正考验。

1. 学生管理系统 ​

任务描述: 使用面向对象编程实现一个简单的学生管理系统,具有以下功能:

  1. Student 类:表示学生,包含学号、姓名、年龄和成绩等属性,以及添加成绩、计算平均成绩等方法
  2. StudentManagementSystem 类:管理学生,包含添加学生、删除学生、查询学生、显示所有学生等方法

提示:

python
class Student:
    def __init__(self, student_id, name, age):
        # 初始化学生信息
        pass
    
    def add_grade(self, course, grade):
        # 添加课程成绩
        pass
    
    def get_average_grade(self):
        # 计算平均成绩
        pass

class StudentManagementSystem:
    def __init__(self):
        # 初始化学生管理系统
        pass
    
    def add_student(self, student):
        # 添加学生
        pass
    
    def remove_student(self, student_id):
        # 删除学生
        pass
    
    def find_student(self, student_id):
        # 查找学生
        pass
    
    def display_all_students(self):
        # 显示所有学生信息
        pass

2. 形状类层次结构 ​

任务描述: 创建一个形状类层次结构,实现以下功能:

  1. 抽象基类 Shape:定义抽象方法 area() 和 perimeter()
  2. 具体类 Rectangle:实现 Shape 接口,包含长和宽属性
  3. 具体类 Circle:实现 Shape 接口,包含半径属性
  4. 具体类 Triangle:实现 Shape 接口,包含底边和高属性
  5. 创建一个函数,接受形状对象并显示其面积和周长

提示:

python
from abc import ABC, abstractmethod
import math

class Shape(ABC):
    @abstractmethod
    def area(self):
        # 计算面积的抽象方法
        pass
    
    @abstractmethod
    def perimeter(self):
        # 计算周长的抽象方法
        pass

class Rectangle(Shape):
    # 实现矩形类
    pass

class Circle(Shape):
    # 实现圆形类
    pass

class Triangle(Shape):
    # 实现三角形类
    pass

# 创建一个函数,显示形状的信息
def display_shape_info(shape):
    print(f"面积: {shape.area():.2f}")
    print(f"周长: {shape.perimeter():.2f}")

💡 部分参考答案 ​

基础练习1. 简单的类定义 ​

python
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def display_info(self):
        print(f"姓名: {self.name}, 年龄: {self.age}")
    
    def calculate_age_after_years(self, years):
        return self.age + years

# 测试代码
person = Person("张三", 18)
person.display_info()
future_age = person.calculate_age_after_years(5)
print(f"5年后的年龄: {future_age}")

基础练习3. 封装练习 ​

python
class BankAccount:
    def __init__(self, account_name, balance=0):
        self.account_name = account_name
        self.__balance = balance  # 私有属性
    
    def deposit(self, amount):
        if amount > 0:
            self.__balance += amount
            print(f"成功存入 {amount} 元。")
        else:
            print("存款金额必须大于0!")
    
    def withdraw(self, amount):
        if amount > 0:
            if amount <= self.__balance:
                self.__balance -= amount
                print(f"成功取出 {amount} 元。")
            else:
                print("余额不足!")
        else:
            print("取款金额必须大于0!")
    
    def get_balance(self):
        return self.__balance
    
    def display_info(self):
        print(f"账户名: {self.account_name}")
        print(f"余额: {self.__balance} 元")

# 测试代码
account = BankAccount("张三", 1000)
account.display_info()
account.deposit(500)
account.display_info()
account.withdraw(200)
account.display_info()
account.withdraw(2000)  # 余额不足

挑战练习1. 学生管理系统(部分实现) ​

python
class Student:
    def __init__(self, student_id, name, age):
        self.student_id = student_id
        self.name = name
        self.age = age
        self.grades = {}
    
    def add_grade(self, course, grade):
        self.grades[course] = grade
    
    def get_average_grade(self):
        if not self.grades:
            return 0
        return sum(self.grades.values()) / len(self.grades)
    
    def display_info(self):
        print(f"学号: {self.student_id}")
        print(f"姓名: {self.name}")
        print(f"年龄: {self.age}")
        print("成绩:")
        for course, grade in self.grades.items():
            print(f"  {course}: {grade}")
        print(f"平均成绩: {self.get_average_grade():.2f}")

class StudentManagementSystem:
    def __init__(self):
        self.students = {}
    
    def add_student(self, student):
        self.students[student.student_id] = student
        print(f"学生 {student.name}(学号: {student.student_id})已添加。")
    
    def remove_student(self, student_id):
        if student_id in self.students:
            del self.students[student_id]
            print(f"学号为 {student_id} 的学生已删除。")
        else:
            print(f"未找到学号为 {student_id} 的学生。")
    
    def find_student(self, student_id):
        return self.students.get(student_id)
    
    def display_all_students(self):
        if not self.students:
            print("暂无学生信息。")
            return
        
        print("所有学生信息:")
        for student in self.students.values():
            student.display_info()
            print("---")

# 测试代码
sms = StudentManagementSystem()
student1 = Student("001", "张三", 18)
student1.add_grade("数学", 85)
student1.add_grade("语文", 90)
sms.add_student(student1)
sms.display_all_students()

📚 拓展学习 ​

如果你想进一步深入学习Python的面向对象编程,可以查看以下资源:

继续加油!💪 面向对象编程是现代编程语言的核心特性,掌握好它将大大提高你的编程能力!

© 2026 老周有AI. All rights reserved.