Python OOP银行模拟器:无需if判断指定方法调用对象的实现
解决银行模拟器中无需if分支切换对象与方法的问题
你可以通过字典映射的方式彻底摆脱大量if判断,分别实现「用户名到对象」和「动作到方法」的直接关联,输入值即可直接匹配到对应的对象或执行方法。
1. 用字典管理用户对象
把创建好的Bank实例存入字典,用用户名做键、实例做值。输入用户名后直接从字典取值,不用逐个判断用户身份:
# 用字典存储所有用户,键为用户名,值为对应Bank实例 users = { 'Steve': Bank('Steve', 1000), 'Bob': Bank('Bob', 1000) }
2. 用字典映射动作与方法
把支持的动作(比如display)和对应的处理逻辑绑定,新增动作时只需往字典加条目,不用修改判断逻辑:
# 动作映射字典:键为输入的动作字符串,值为对应的执行逻辑 action_map = { 'display': lambda user: user.display(), 'deposit': lambda user: print(f"{user.name}的存款功能待实现"), 'withdraw': lambda user: print(f"{user.name}的取款功能待实现") }
完整修改后的代码
class Bank: def __init__(self, name, balance): self.name = name self.balance = balance def transfer(self, recipient): amount = float(input('输入转账金额:\n')) if amount <= self.balance: # 修正原代码逻辑错误:余额足够才允许转账 self.balance -= amount recipient.balance += amount print(f"成功转账{amount}给{recipient.name}") else: print('余额不足,无法完成转账!') def display(self): print(f"{self.name}的当前余额:{self.balance}") # 字典管理所有用户 users = { 'Steve': Bank('Steve', 1000), 'Bob': Bank('Bob', 1000) } # 动作与执行逻辑的映射 action_map = { 'display': lambda user: user.display(), 'deposit': lambda user: print(f"{user.name}的存款功能后续补充"), 'withdraw': lambda user: print(f"{user.name}的取款功能后续补充"), 'transfer': lambda user: handle_transfer(user) } def handle_transfer(user): recipient_name = input("输入收款方用户名:") if recipient_name in users: user.transfer(users[recipient_name]) else: print("收款用户不存在!") while True: user_name = input('请输入你的用户名:').strip() # 校验用户是否存在 if user_name not in users: print("用户不存在,请重新输入!") continue current_user = users[user_name] action = input('请选择操作:(display, deposit, withdraw, transfer)\n').strip() # 直接通过映射执行动作,无需if分支判断 if action in action_map: action_map[action](current_user) else: print("无效操作,请重新选择!")
补充说明
- 字典映射的扩展性极强:新增用户只需往
users字典加条目,新增动作只需往action_map加逻辑,完全不用改动核心循环的判断代码 - 修正了原代码中
transfer方法的逻辑错误(原代码判断amount >= self.balance会导致余额不足时才转账) - 转账逻辑单独抽离为
handle_transfer函数,让代码结构更清晰
内容的提问来源于stack exchange,提问作者Joshua Hildebrandt
相关产品推荐
相关产品推荐

