📝 第8天:面向对象编程基础魔法练习 - 魔法师的实战训练场
🎉 欢迎来到面向对象编程基础魔法的练习环节!通过前面的魔法课堂学习,我们已经掌握了咒语书(类)和魔法卷轴(对象)的基本概念,以及面向对象编程的四大高级魔法特性(封装、继承、多态和抽象)。现在是时候通过实战练习来巩固这些魔法知识了!
🎯 练习目标
- 掌握类的定义和对象的创建
- 理解并使用实例变量和类变量
- 熟练定义和调用实例方法
- 理解封装的概念并能够应用
- 掌握继承的实现和方法重写
- 理解多态的概念并能够应用
- 熟悉Python中的特殊方法
🏋️ 基础练习
1. 简单的类定义
任务描述: 定义一个名为 Person 的类,包含以下内容:
- 初始化方法,接受姓名和年龄作为参数
- 一个显示个人信息的方法
display_info() - 一个计算几年后年龄的方法
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 的类,包含以下内容:
- 一个类变量
company_name,值为 "ABC Company" - 初始化方法,接受姓名、职位和工资作为参数
- 一个显示员工信息的方法
display_info() - 一个类方法
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 的类,实现以下功能:
- 初始化方法,接受账户名和初始余额(默认为0)
- 一个存款方法
deposit(amount) - 一个取款方法
withdraw(amount),确保余额不小于0 - 一个获取余额的方法
get_balance() - 使用私有属性来存储余额,防止直接修改
示例代码:
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:
Animal类包含name属性和eat()方法Dog类继承自Animal,添加breed属性和bark()方法Cat类继承自Animal,添加color属性和meow()方法- 在派生类中重写
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 的类,实现以下功能:
- 初始化方法,接受 x 和 y 坐标
- 实现
__str__方法,返回点的字符串表示 - 实现
__add__方法,支持两个点的加法(坐标相加) - 实现
__eq__方法,判断两个点是否相等 - 实现
__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. 学生管理系统
任务描述: 使用面向对象编程实现一个简单的学生管理系统,具有以下功能:
Student类:表示学生,包含学号、姓名、年龄和成绩等属性,以及添加成绩、计算平均成绩等方法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):
# 显示所有学生信息
pass2. 形状类层次结构
任务描述: 创建一个形状类层次结构,实现以下功能:
- 抽象基类
Shape:定义抽象方法area()和perimeter() - 具体类
Rectangle:实现Shape接口,包含长和宽属性 - 具体类
Circle:实现Shape接口,包含半径属性 - 具体类
Triangle:实现Shape接口,包含底边和高属性 - 创建一个函数,接受形状对象并显示其面积和周长
提示:
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的面向对象编程,可以查看以下资源:
继续加油!💪 面向对象编程是现代编程语言的核心特性,掌握好它将大大提高你的编程能力!




