从‘卖书’到‘介绍人’:用3个接地气的Python类案例,把面向对象编程讲明白

张开发
2026/4/20 3:38:50 15 分钟阅读

分享文章

从‘卖书’到‘介绍人’:用3个接地气的Python类案例,把面向对象编程讲明白
从‘卖书’到‘介绍人’用3个接地气的Python类案例把面向对象编程讲明白想象你走进一家书店店员热情地迎上来您是会员吗我们可以为您推荐新书。你点点头对方立刻调出你的阅读偏好和购买记录。这背后是一套精密的系统在运作——而用Python的类与对象你完全可以自己实现这样的功能。本文将用三个生活化的案例带你从书店会员管理到图书销售再到订单处理一步步掌握面向对象编程的核心思想。1. 书店会员系统类的定义与实例化让我们从最简单的会员系统开始。每个书店会员都有姓名、等级和积分这些基本信息还可能享受不同的折扣。用面向对象的思想我们可以把这些属性和行为封装在一个类里class BookstoreMember: def __init__(self, name, level普通, points0): self.name name self.level level self.points points self.discount 0.9 if level 黄金 else 1.0 def add_points(self, amount): self.points amount if self.points 1000 and self.level ! 黄金: self.upgrade_level() def upgrade_level(self): self.level 黄金 self.discount 0.9 print(f恭喜{self.name}升级为黄金会员)这个简单的类已经包含了面向对象编程的几个关键要素__init__方法这是类的构造函数在创建对象时自动调用。我们用它初始化会员的姓名、等级和积分。实例属性name、level、points和discount都是对象的属性存储对象的状态。实例方法add_points和upgrade_level是对象可以执行的操作。创建一个会员对象并与之交互# 创建会员 alice BookstoreMember(Alice) print(f{alice.name}是{alice.level}会员享受{alice.discount}折优惠) # 添加积分 alice.add_points(1200) # 超过1000分自动升级 print(f当前等级{alice.level}积分{alice.points})提示self参数代表类的实例本身通过它可以访问实例的属性和方法。这是Python类方法的标准写法。2. 图书管理系统属性与方法的实战有了会员自然要有图书。让我们设计一个Book类来管理书店的库存class Book: def __init__(self, title, author, isbn, price, stock): self.title title self.author author self.isbn isbn self.price price self.stock stock def apply_discount(self, discount_rate): 应用折扣返回折扣后价格 discounted round(self.price * discount_rate, 2) return discounted def update_stock(self, amount): 更新库存正数表示进货负数表示售出 if self.stock amount 0: print(f库存不足当前仅剩{self.stock}本) return False self.stock amount return True def display_info(self): 显示图书信息 info f 《{self.title}》 作者{self.author} ISBN{self.isbn} 价格¥{self.price} 库存{self.stock}本 print(info)这个类展示了更多面向对象的特性封装数据和行为图书的属性和操作图书的方法都在同一个类中方法返回值apply_discount返回折扣后的价格update_stock返回操作是否成功业务逻辑验证update_stock会检查库存是否足够使用示例# 创建图书对象 python_book Book( titlePython编程从入门到实践, authorEric Matthes, isbn9787115428028, price89.00, stock10 ) # 展示图书信息 python_book.display_info() # 应用会员折扣 member_discount 0.8 # 假设会员8折 final_price python_book.apply_discount(member_discount) print(f会员价¥{final_price}) # 售出一本 if python_book.update_stock(-1): print(销售成功)3. 订单处理系统类之间的关系现在我们有会员和图书需要一个Order类来连接两者并处理交易class Order: def __init__(self, member, books): self.member member self.books books # 图书及其数量的字典如{book_obj: 2} self.order_date datetime.now() self.order_id self._generate_id() staticmethod def _generate_id(): 生成订单ID return str(uuid.uuid4()).split(-)[0] def calculate_total(self): 计算订单总价含会员折扣 total 0 for book, quantity in self.books.items(): price book.apply_discount(self.member.discount) total price * quantity return total def process_order(self): 处理订单 # 检查库存 for book, quantity in self.books.items(): if not book.update_stock(-quantity): return False # 添加会员积分每10元1积分 points int(self.calculate_total() / 10) self.member.add_points(points) return True def print_receipt(self): 打印收据 print(f订单号{self.order_id}) print(f会员{self.member.name}) print(购买商品) for book, quantity in self.books.items(): print(f 《{book.title}》x{quantity}) print(f总价¥{self.calculate_total()}) print(f下单时间{self.order_date})这个类展示了更高级的概念类之间的关系Order类关联了BookstoreMember和Book类静态方法_generate_id不依赖于实例用staticmethod装饰业务逻辑整合处理订单时同时更新库存和会员积分完整的使用场景from datetime import datetime import uuid # 创建会员 bob BookstoreMember(Bob, level黄金) # 创建图书 book1 Book(Python核心编程, Wesley Chun, 9787115353528, 108.00, 5) book2 Book(流畅的Python, Luciano Ramalho, 9787115454157, 139.00, 3) # 创建订单购买2本book1和1本book2 order Order( memberbob, books{ book1: 2, book2: 1 } ) # 处理订单 if order.process_order(): print(订单处理成功) order.print_receipt() print(f{bob.name}当前积分{bob.points}) else: print(订单处理失败请检查库存)4. 进阶技巧类方法与属性装饰器除了上面展示的基础用法Python类还有一些强大的特性可以优化我们的代码类方法类方法使用classmethod装饰第一个参数是cls类本身而非实例常用于创建替代构造函数class Book: # ... 之前的代码 ... classmethod def from_csv(cls, csv_string): 从CSV字符串创建Book实例 title, author, isbn, price, stock csv_string.split(,) return cls(title, author, isbn, float(price), int(stock)) # 使用类方法创建对象 csv_data Python数据科学手册,Jake VanderPlas,9787115475893,109.00,8 data_book Book.from_csv(csv_data) data_book.display_info()属性装饰器property装饰器可以把方法变成属性实现更精细的属性控制class BookstoreMember: # ... 之前的代码 ... property def status(self): 根据积分返回会员状态描述 if self.level 黄金: return 尊贵的黄金会员 elif self.points 500: return 即将升级的活跃会员 else: return 普通会员 status.setter def status(self, value): 不允许直接设置status raise AttributeError(status是计算属性不能直接设置) # 使用属性 print(f{alice.name}是{alice.status}) # 调用时不需要括号类变量与实例变量类变量被所有实例共享而实例变量是每个实例独有的class Book: # 类变量 all_books [] def __init__(self, title, author): self.title title # 实例变量 self.author author Book.all_books.append(self) # 将新书添加到类变量中 classmethod def count_books(cls): return len(cls.all_books) # 使用类变量 book1 Book(Python基础教程, Magnus Lie Hetland) book2 Book(Effective Python, Brett Slatkin) print(f书店共有{Book.count_books()}本书) # 输出25. 实战建议设计类的思考过程在实际项目中设计类时可以遵循以下思考流程识别现实世界实体找出系统中需要表示的主要对象如会员、图书、订单定义属性每个对象有哪些特征会员有姓名、等级等确定行为对象能做什么图书可以打折、更新库存明确关系对象之间如何交互订单关联会员和图书考虑特殊需求是否需要类方法、静态方法或属性装饰器常见的设计原则单一职责原则一个类只负责一件事开放封闭原则对扩展开放对修改封闭组合优于继承尽量使用组合而非继承来复用代码例如我们之前的Order类就遵循了单一职责原则——它只负责处理订单相关的逻辑而不涉及会员或图书的具体实现细节。

更多文章