循环生成类对象时最后元素覆盖所有前置值问题求助
解决循环中类属性被最后一次迭代覆盖的问题
问题根源
你当前的代码中,base_node = Library只是引用了同一个Library类对象,每次修改的是类的类属性NAME。由于classes列表里的所有元素都是这个类的引用,最后一次迭代对NAME的修改会覆盖之前所有的赋值,导致最终输出全是最后一个值。
解决方案
方案1:使用实例属性(推荐,若NAME属于实例而非类)
将NAME改为实例属性,每次循环创建独立的类实例,每个实例拥有自己的NAME值:
class Library(): def __init__(self, name): self.NAME = name print('init') classes = [] for x in ['a', 'b', 'c']: base_node = Library(x) classes.append(base_node) print(base_node.NAME) print('Now for full list print:') for n in classes: print(n.NAME)
方案2:动态创建子类(若需生成不同的类对象)
如果你的需求是为每个字符串生成新的类而非实例,可以用type()动态创建子类,每个子类拥有独立的类属性NAME:
class Library(): NAME = 'Library' def __init__(self): print('init') classes = [] for x in ['a', 'b', 'c']: # 动态生成子类,自定义类名、父类、类属性 base_node = type(f'Library_{x}', (Library,), {'NAME': x}) classes.append(base_node) print(base_node.NAME) print('Now for full list print:') for n in classes: print(n.NAME)
验证结果
两种方案的输出都会符合你的预期:
init a init b init c Now for full list print: a b c
内容的提问来源于stack exchange,提问作者Jimmy Johansson
相关产品推荐
相关产品推荐

