You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 00:52:51