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 和两个派生类 DogCat

  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的面向对象编程,可以查看以下资源:

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

© 2025 技术博客. All rights reserved by 老周有AI