🖥️ 上机练习

第 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 分钟