Python 3.9 Driver类中替代switch-case的优雅方案咨询
优雅替代if-else的动作映射方案
在Python中处理这种“编号-方法”的映射需求,最常用且优雅的方案是字典映射法,另外还有枚举类、动态属性获取等可选方案,以下是具体实现:
1. 字典映射法(推荐)
直接构建一个以动作编号为键、对应方法为值的字典,初始化时完成映射,遍历输入数组即可直接调用方法,结构清晰且易于维护:
class Driver: def __init__(self, action_numbers): # 建立动作编号到方法的映射 self.action_map = { 0: self.act_left, 1: self.act_right, 2: self.act_straight, # 补充剩余7个动作的映射,格式为 编号: self.act_xxx } # 执行输入的动作序列 self.run_actions(action_numbers) def act_left(self): print("执行左转动作") def act_right(self): print("执行右转动作") def act_straight(self): print("执行直行动作") # 此处添加剩余7个动作方法... def run_actions(self, action_numbers): for num in action_numbers: # 校验编号合法性,避免KeyError if action := self.action_map.get(num): action() else: print(f"忽略无效动作编号: {num}")
优势:
- 新增/修改动作只需在字典中调整键值对,无需修改逻辑代码
- 调用逻辑简洁直观,可读性强
- 可以灵活处理非法编号
2. 枚举类增强语义
如果需要让动作编号更具语义性(避免硬编码数字),可以结合enum枚举类使用:
from enum import Enum # 定义动作枚举,将编号与语义绑定 class ActionType(Enum): LEFT = 0 RIGHT = 1 STRAIGHT = 2 # 补充剩余动作的枚举定义... class Driver: def __init__(self, action_numbers): self.action_map = { ActionType.LEFT.value: self.act_left, ActionType.RIGHT.value: self.act_right, ActionType.STRAIGHT.value: self.act_straight, # 补充剩余映射 } self.run_actions(action_numbers) # 动作方法同前... def run_actions(self, action_numbers): for num in action_numbers: try: self.action_map[num]() except KeyError: print(f"忽略无效动作编号: {num}")
优势:
- 动作编号语义化,团队协作时更清晰
- 避免数字硬编码带来的维护问题
3. 动态属性获取(适合方法命名有规律的场景)
如果你的动作方法命名严格遵循act_xxx的规则,且编号与方法后缀顺序一一对应,可以用getattr动态获取方法:
class Driver: def __init__(self, action_numbers): # 按编号顺序定义方法后缀 self.action_suffixes = ["left", "right", "straight"] # 补充剩余7个后缀 self.run_actions(action_numbers) def act_left(self): print("执行左转动作") # 其他动作方法... def run_actions(self, action_numbers): for num in action_numbers: if 0 <= num < len(self.action_suffixes): method_name = f"act_{self.action_suffixes[num]}" # 动态获取方法并调用 getattr(self, method_name)() else: print(f"忽略无效动作编号: {num}")
优势:
- 无需手动维护映射字典,适合方法命名规则固定的场景
- 代码量更少
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

