如何从元组列表实例化Year系列子类对象?
问题解答
直接用你写的列表推导式self.years= [year[0](year[1]) for year in years]不能实现需求,原因很简单:year[0]是字符串(比如'Year1'),不是对应的类对象,你没法直接调用字符串来生成类实例,运行时会抛出TypeError: 'str' object is not callable错误。
要实现需求,有两种常用的可行方案:
方案1:建立类名字符串与类对象的映射字典(推荐)
先定义一个字典,把类名字符串和对应的类关联起来,再通过字典获取类来实例化:
class Lesson: def __init__(self, teacher, years): # 建立类名到类对象的映射 year_class_map = { 'Year1': Year1, 'Year2': Year2, 'Year3': Year3 } # 通过列表推导式生成实例列表 self.years = [year_class_map[year_name](age) for year_name, age in years]
这种方式清晰可控,不会依赖全局命名空间,也能避免类名拼写错误导致的意外问题。
方案2:利用全局命名空间获取类(不推荐)
如果你的Year系列类都在全局命名空间中,可以通过globals()函数获取类对象:
class Lesson: def __init__(self, teacher, years): self.years = [globals()[year_name](age) for year_name, age in years]
但这种方法风险较高——如果类名拼写错误、类被移到其他模块或者不在全局空间里,就会抛出KeyError,维护起来很麻烦,所以不建议在生产代码中使用。
内容的提问来源于stack exchange,提问作者Nemo
相关产品推荐
相关产品推荐

