面向对象编程三大综合案例详解:门票系统、学生管理、手机套餐

引言

面向对象编程(OOP)是现代编程语言中的重要范式,它通过将数据和方法封装在对象中,使代码更易于维护和扩展。本文将通过三个综合案例,详细讲解如何在实际开发中应用面向对象编程思想。每个案例都包含完整的需求分析、代码实现和优化建议,适合有一定Python基础的开发者学习参考。


案例一:游乐园门票价格计算系统

题目要求

按照以下要求定义一个游乐园门票类,并创建实例调用函数完成儿童和大人的总票价统计(人数不定,由你输入的人数个数来决定):

  1. 平日票价100元

  2. 周末票价为平日票价120%

  3. 儿童半价

完整代码实现

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("输入错误,请确保输入的是有效数字!")

代码解析与优化建议

  1. 类设计亮点

    • 使用类常量定义基础价格和折扣率,便于统一修改

    • 将计算逻辑封装在方法中,外部只需调用即可获得结果

  2. 优化方向

    • 可以增加节假日特殊定价

    • 添加团体票折扣功能

    • 支持多种票类型(如VIP票)


案例二:学生信息管理系统

题目要求

定义一个学生类,要求:

  1. 类属性:姓名、年龄、成绩(语文,数学,英语)[每课成绩的类型为整数]

  2. 类方法:

    • 获取学生的姓名: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()

代码解析与优化建议

  1. 设计特点

    • 使用实例属性而非类属性,支持创建多个学生对象

    • 添加了show_info()方法展示完整信息

  2. 扩展建议

    • 增加成绩修改方法

    • 添加计算平均分功能

    • 实现成绩排名比较


案例三:手机套餐办理系统

题目要求

根据需求完成代码:

  1. 定义一个用户类

    • 要求有用户名与充值金额

  2. 定义一个手机类

    • 要求快捷输出默认的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()

代码解析与优化建议

  1. 高级特性应用

    • 使用Enum枚举类型定义套餐,提高代码可读性

    • 使用字典推导式初始化套餐计数器

    • 添加__str__方法改善对象打印输出

  2. 业务扩展方向

    • 增加套餐变更功能

    • 添加月费自动扣款

    • 实现套餐使用情况查询


总结与思考

通过这三个案例,我们可以清晰地看到面向对象编程在实际应用中的优势:

  1. 封装性:将数据和操作封装在类中,隐藏实现细节

  2. 可扩展性:通过添加新方法或属性轻松扩展功能

  3. 可维护性:相关功能组织在一起,便于维护和修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值