Python类内嵌套类实例列表赋值触发AttributeError该如何解决?
错误产生原因
报错AttributeError: 'list' object has no attribute 'nom'的核心原因是classe类的t属性定义逻辑错误:
- 你写的
t=[[eleve] for i in range(3)]给每个元素额外套了一层列表,所以y.t[i]取到的是一个列表,不是你预期的学生类对象,自然不存在nom属性 - 除了多余的嵌套问题,你还没有对
eleve类做实例化,列表里存的是eleve类本身,就算去掉外层嵌套,后续修改属性也会修改所有实例共享的类属性,无法实现每个学生存储独立信息的需求 - 额外逻辑问题:你调用
RempClasse时直接传入了classe类本身,没有实例化,t作为类属性会被所有classe实例共享,不符合面向对象的常规使用逻辑
修复方案
修复后的可运行代码如下:
def RempClasse(y): for i in range(3): y.t[i].nom = input("nom du elevel") y.t[i].moyen = float(input("moyenne du elevel")) for i in range(3): print(y.t[i].nom) print(y.t[i].moyen) class eleve : # 用构造方法定义实例属性,避免类属性全局共享 def __init__(self): self.nom = "" self.moyen = 0.0 class classe : def __init__(self): # 去掉多余嵌套,每个元素都是独立的eleve类实例 self.t = [eleve() for _ in range(3)] # 先实例化classe类再传入函数,去掉无意义的print调用(函数无返回值,打印会输出None) classe_obj = classe() RempClasse(classe_obj)
主要修改点:
- 给
eleve、classe类新增构造方法__init__,把属性定义为实例属性,避免全局共享的问题 - 把
classe中t列表的生成逻辑从[[eleve] for i in range(3)]改成了[eleve() for _ in range(3)],去掉多余嵌套同时完成学生类的实例化 - 调用函数前先实例化
classe类得到实例对象,再传入函数处理,不再直接传入类本身 - 去掉不必要的
print(RempClasse(classe))调用,避免打印无意义的None值
内容的提问来源于stack exchange,提问作者Baba Ganoush
相关产品推荐
相关产品推荐

