引言
面向对象编程(OOP)是现代编程语言中的重要范式,它通过将数据和方法封装在对象中,使代码更易于维护和扩展。本文将通过三个综合案例,详细讲解如何在实际开发中应用面向对象编程思想。每个案例都包含完整的需求分析、代码实现和优化建议,适合有一定Python基础的开发者学习参考。
案例一:游乐园门票价格计算系统
题目要求
按照以下要求定义一个游乐园门票类,并创建实例调用函数完成儿童和大人的总票价统计(人数不定,由你输入的人数个数来决定):
-
平日票价100元
-
周末票价为平日票价120%
-
儿童半价
完整代码实现
class Ticket:
# 基础票价
BASE_PRICE = 100
CHILD_DISCOUNT = 0.5 # 儿童折扣率
WEEKEND_RATE = 1.2 # 周末溢价率
def __init__(self, child_num, adult_num, is_weekend):
self.child_num = child_num
self.adult_num = adult_num
self.is_weekend = is_weekend
def calculate_total(self):
"""计算总票价"""
child_price = self.BASE_PRICE * self.CHILD_DISCOUNT
adult_price = self.BASE_PRICE
if self.is_weekend:
child_price *= self.WEEKEND_RATE
adult_price *= self.WEEKEND_RATE
total = (self.child_num * child_price) + (self.adult_num * adult_price)
return total
# 使用示例
try:
children = int(input("请输入儿童人数: "))
adults = int(input("请输入成人人数: "))
weekend = int(input("是否是周末?(1-是,0-否): "))
ticket = Ticket(children, adults, weekend)
print(f"总票价为: {ticket.calculate_total():.2f}元")
except ValueError:
print("输入错误,请确保输入的是有效数字!")
代码解析与优化建议
-
类设计亮点:
-
使用类常量定义基础价格和折扣率,便于统一修改
-
将计算逻辑封装在方法中,外部只需调用即可获得结果
-
-
优化方向:
-
可以增加节假日特殊定价
-
添加团体票折扣功能
-
支持多种票类型(如VIP票)
-
案例二:学生信息管理系统
题目要求
定义一个学生类,要求:
-
类属性:姓名、年龄、成绩(语文,数学,英语)[每课成绩的类型为整数]
-
类方法:
-
获取学生的姓名:get_name() 返回类型:str
-
获取学生的年龄:get_age() 返回类型:int
-
返回3门科目中最高的分数:get_course() 返回类型:int
-
完整代码实现
class Student:
def __init__(self, name, age, scores):
"""
初始化学生信息
:param name: 姓名
:param age: 年龄
:param scores: 成绩列表[语文, 数学, 英语]
"""
self.name = name
self.age = age
self.scores = scores
def get_name(self):
"""获取学生姓名"""
return self.name
def get_age(self):
"""获取学生年龄"""
return self.age
def get_course(self):
"""获取最高分科目成绩"""
return max(self.scores)
def show_info(self):
"""显示学生完整信息"""
print(f"学生姓名: {self.get_name()}")
print(f"学生年龄: {self.get_age()}")
print(f"各科成绩: 语文{self.scores[0]}, 数学{self.scores[1]}, 英语{self.scores[2]}")
print(f"最高分数: {self.get_course()}")
# 使用示例
student1 = Student("张三", 18, [85, 92, 88])
student1.show_info()
代码解析与优化建议
-
设计特点:
-
使用实例属性而非类属性,支持创建多个学生对象
-
添加了show_info()方法展示完整信息
-
-
扩展建议:
-
增加成绩修改方法
-
添加计算平均分功能
-
实现成绩排名比较
-
案例三:手机套餐办理系统
题目要求
根据需求完成代码:
-
定义一个用户类
-
要求有用户名与充值金额
-
-
定义一个手机类
-
要求快捷输出默认的3种套餐
-
设计办理套餐的方法,判断金额大小与套餐金额,提示办理成功与否
-
设计方法用来统计所有的用户数量与各个套餐的办理总数
-
完整代码实现
from enum import Enum
class PlanType(Enum):
"""套餐类型枚举"""
DYNAMIC = ("动感地带套餐", 18)
FAMILY = ("家庭版通用套餐", 28)
UNLIMITED = ("无限畅玩套餐", 38)
class User:
"""用户类"""
total_users = 0
plan_counts = {plan: 0 for plan in PlanType}
def __init__(self, name, balance):
self.name = name
self.balance = balance
User.total_users += 1
def __str__(self):
return f"用户[{self.name}] 余额: {self.balance}元"
class MobileService:
"""手机服务类"""
def __init__(self):
print("\n可选套餐列表:")
for i, plan in enumerate(PlanType, 1):
print(f"{i}. {plan.value[0]} - {plan.value[1]}元/月")
def apply_plan(self, user, plan_choice):
"""办理套餐"""
try:
plan = list(PlanType)[plan_choice-1]
except IndexError:
return "无效的套餐选择"
plan_name, plan_price = plan.value
if user.balance >= plan_price:
user.balance -= plan_price
User.plan_counts[plan] += 1
return f"{user.name}成功办理{plan_name},扣除{plan_price}元,剩余余额{user.balance}元"
else:
return f"余额不足,{user.name}办理{plan_name}失败"
@classmethod
def show_statistics(cls):
"""显示统计信息"""
print("\n=== 统计数据 ===")
print(f"总用户数: {User.total_users}")
print("套餐办理情况:")
for plan, count in User.plan_counts.items():
print(f"{plan.value[0]}: {count}人")
# 使用示例
if __name__ == "__main__":
service = MobileService()
# 创建用户
user1 = User("张三", 50)
user2 = User("李四", 30)
print("\n当前用户:")
print(user1)
print(user2)
# 办理套餐
print("\n办理结果:")
print(service.apply_plan(user1, 1)) # 办理动感地带套餐
print(service.apply_plan(user1, 3)) # 尝试办理无限畅玩套餐
print(service.apply_plan(user2, 2)) # 办理家庭版套餐
# 显示统计
MobileService.show_statistics()
代码解析与优化建议
-
高级特性应用:
-
使用Enum枚举类型定义套餐,提高代码可读性
-
使用字典推导式初始化套餐计数器
-
添加__str__方法改善对象打印输出
-
-
业务扩展方向:
-
增加套餐变更功能
-
添加月费自动扣款
-
实现套餐使用情况查询
-
总结与思考
通过这三个案例,我们可以清晰地看到面向对象编程在实际应用中的优势:
-
封装性:将数据和操作封装在类中,隐藏实现细节
-
可扩展性:通过添加新方法或属性轻松扩展功能
-
可维护性:相关功能组织在一起,便于维护和修改