🖥️ 上机练习
第 7 章 · 面向对象编程 · 共 8 题 · 请打开 PyCharm 或交互式环境独立完成 · 覆盖 class定义、__init__、封装、继承、多态、运算符重载、抽象类
💡
本页只显示题目,参考答案请课后向老师索取,或参考课堂习题部分。
练习 01
定义类与创建对象
定义一个
BankAccount(银行账户)类,要求:
__init__方法中设置owner(账户名)和balance(余额,默认0)属性- 添加
deposit(amount)(存款)和withdraw(amount)(取款)两个方法 - 取款时需判断余额是否足够,不足时打印提示信息
- 添加
show_balance方法显示当前余额 - 创建两个账户对象,分别演示存款、取款、余额不足等操作
提示:取款时用 if 判断 amount > self.balance。
⏱ 参考用时:12 分钟
练习 02
时钟类进阶
在课堂讲的 Clock 时钟类基础上,增加以下功能:
- 添加
set_time(hour, minute, second)方法设置时间 - 添加
is_midnight()方法,返回当前是否为午夜(00:00:00) - 添加一个
tick()方法,调用 run() 后打印当前时间(模拟一次嘀嗒) - 创建 Clock(23, 59, 55) 对象,循环调用 tick() 至少 10 次,观察时间进位效果
提示:午夜即 hour==0 and min==0 and sec==0。
⏱ 参考用时:10 分钟
练习 03
封装与可见性
定义一个
User 类,实现密码的封装管理:
username公开属性,__password私有属性- 提供
set_password(old_pwd, new_pwd)方法:验证旧密码正确才允许修改 - 提供
check_password(pwd)方法:验证密码是否正确,返回 True/False - 创建用户对象,分别测试正确密码和错误密码的修改和验证
- 尝试在类外部直接访问
__password,观察报错信息
提示:这是封装思想的典型应用——隐藏内部密码数据,只暴露安全的操作接口。
⏱ 参考用时:12 分钟
练习 04
静态方法与类方法
定义一个
MathHelper 类(无需创建对象):
@staticmethod is_even(n):判断 n 是否为偶数@staticmethod factorial(n):循环计算 n 的阶乘@staticmethod gcd(a, b):辗转相除法求最大公约数@classmethod describe(cls):打印类名和类文档字符串- 全部通过类名调用,不创建实例对象
提示:cls.__name__ 获取类名,cls.__doc__ 获取文档字符串。
⏱ 参考用时:15 分钟
练习 05
继承体系设计
设计一个简单的学校人员管理系统:
- Person(父类):name、age、
introduce()自我介绍方法 - Student(Person):增加 grade(年级)属性,重写 introduce 输出"我是X年级学生XX"
- Teacher(Person):增加 subject(科目)属性,重写 introduce 输出"我是XX老师,教XX"
- 使用
super().__init__()调用父类初始化 - 创建3个学生和2个老师,存入列表,循环调用 introduce() 展示多态
提示:for p in people: p.introduce() —— 同一方法名,不同子类输出不同内容。
⏱ 参考用时:15 分钟
练习 06
@property 实战:温度转换类
定义一个
Temperature 类:
__init__(self, celsius):接收摄氏温度@property celsius:返回摄氏温度@property fahrenheit:返回华氏温度(公式:F = C × 9/5 + 32)@property kelvin:返回开氏温度(公式:K = C + 273.15)- 创建几个温度对象,测试三种温度单位的自动转换
提示:fahrenheit 和 kelvin 是只读属性,通过计算实时得出,无需存储。
⏱ 参考用时:10 分钟
练习 07
运算符重载:学生成绩排名
定义一个
Score 类,实现以下功能:
__init__(self, name, math, english, python):三门成绩@property total:返回总分- 重载
__lt__按总分从高到低排序 - 重载
__str__输出格式:姓名 | 数学:XX 英语:XX Python:XX | 总分:XX - 创建至少5个学生,使用
sort()排名并打印
提示:__lt__ 中返回 self.total > other.total 可实现从高到低排序。
⏱ 参考用时:15 分钟
练习 08
挑战题:抽象类与工资结算
参照课堂讲的工资结算系统,自行设计并扩展:
- 定义
Employee抽象类(ABCMeta),含抽象方法get_salary() - Manager:月薪固定 20000
- Programmer:时薪 250 × 工作小时,超过 160 小时部分按 1.5 倍计算
- Salesman:底薪 2000 + 提成,销售额 ≤ 50000 提成 3%,超出部分提成 8%
- Intern(新增):固定月薪 3000,且有学校名称属性
- 创建各类员工对象,使用
isinstance输入数据,统一结算并输出
提示:Programmer 加班费 if wh > 160: salary = 160*250 + (wh-160)*250*1.5。
⏱ 参考用时:20 分钟