无需if语句根据能力字典自动实例化对应类的实现方法
无if语句的实现方案
最简洁的实现方式是使用类映射表+工厂函数的模式,完全不需要写多分支if判断,后续扩展新类也更灵活。
完整实现代码
第一步:定义基础类
class Man: def __init__(self, abilities): self.strength = abilities["strength"] class Women: def __init__(self, abilities): self.empathy = abilities["empathy"]
第二步:建立映射规则
把能力字段和对应的类做绑定,后续新增类只需要更新这个映射表即可:
class_mapping = { "strength": Man, "empathy": Women }
第三步:实现无if的工厂函数
用生成器表达式匹配对应类,无需显式写if分支:
def create_instance(ability_dict): return next( target_class(ability_dict) for ability_key, target_class in class_mapping.items() if ability_key in ability_dict )
测试效果
abilities1 = { "empathy" : 1000 } abilities2 = { "strength" : 100 } print(type(create_instance(abilities1))) # 输出 <class '__main__.Women'> print(type(create_instance(abilities2))) # 输出 <class '__main__.Man'>
扩展说明
- 如果存在一个字典同时包含多个匹配key的场景,调整
class_mapping里的键顺序即可控制匹配优先级,排在前面的key会优先命中 - 如果需要处理无匹配的场景,可以给
next方法加默认值,比如返回默认类实例或者抛出自定义异常,示例:def create_instance(ability_dict): return next( (target_class(ability_dict) for ability_key, target_class in class_mapping.items() if ability_key in ability_dict), DefaultPerson(ability_dict) # 无匹配时返回默认类实例 ) - 该方案比多分支if的扩展性强,新增类时不需要修改工厂函数的逻辑,只需要在映射表里新增一条规则即可
- 示例中的性别相关设定仅作功能演示使用,无实际指代意义
内容的提问来源于stack exchange,提问作者dannyx
相关产品推荐
相关产品推荐

