You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:00:02