如何通过对象名称列表实例化对象并映射至字典键?
解决方案:通过类名字符串初始化对象并映射到字典
看起来你想实现通过类名字符串列表初始化对应类的实例,并将这些实例映射到字典的键对吧?我来帮你梳理下原代码的问题,再给出更简洁高效的实现方案:
原代码的几个问题
__init__方法缺少必须的self参数,而且调用父类构造的方式可以用super()更规范- 你把
name定义成了实例属性,这样必须实例化才能访问,而我们需要直接通过类来获取名称 - 嵌套循环的方式效率较低,而且代码没写完,我们可以用更高效的映射方式来替代
修正后的完整实现
首先补全父类Shape,然后把子类的name设为类属性(直接属于类,而非实例):
class Shape: def __init__(self): # 父类的通用初始化逻辑,比如定义通用属性 self.sides = 0 class Triangle(Shape): name = "Triangle" # 类属性,直接通过 Triangle.name 访问 def __init__(self): super().__init__() # 用super()调用父类构造,更简洁且适配多继承 self.sides = 3 class Square(Shape): name = "Square" def __init__(self): super().__init__() self.sides = 4
接下来优化对象初始化逻辑,先建立类名字符串到类本身的映射,再批量初始化实例存入字典:
# 先创建类名到类的映射字典,避免嵌套循环 class_name_mapping = {cls.name: cls for cls in (Triangle, Square)} classDict = {} def initObjects(): classList = ["Triangle", "Square"] for shape_name in classList: if shape_name in class_name_mapping: # 取出对应的类,实例化后存入字典 classDict[shape_name] = class_name_mapping[shape_name]() else: print(f"提示:未找到名为 '{shape_name}' 的形状类") # 调用初始化函数 initObjects() # 验证结果 for shape_name, instance in classDict.items(): print(f"{shape_name} 实例:{instance},边数:{instance.sides}")
进阶简化方案(如果类名和name属性一致)
如果你的类名和name属性完全相同,还可以直接用globals()全局作用域来获取类,省去手动创建映射字典的步骤:
classDict = {} def initObjects_alternative(): classList = ["Triangle", "Square"] for shape_name in classList: # 检查全局作用域中是否存在该类,且是Shape的子类 if shape_name in globals() and issubclass(globals()[shape_name], Shape): classDict[shape_name] = globals()[shape_name]() else: print(f"提示:无效的形状名称 '{shape_name}'")
内容的提问来源于stack exchange,提问作者Well-Known Member
相关产品推荐
相关产品推荐

