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

如何通过名称循环访问Python类实例属性?现有代码报错求助

解决动态访问类实例属性的问题

你的问题核心是想通过动态生成的属性名称循环访问类实例的属性,原代码里的两种写法都存在逻辑错误,我来一步步帮你修正:

先拆解原代码的问题

  • print(fun.X + i):Python会直接去找fun实例中名为X的属性,但你实际定义的是X1、X2、X3,而且这种写法根本没法把X和i拼接成合法的属性名,属于语法逻辑错误。
  • print(globals()['fun.X' + str(i)]):globals()字典里存放的是全局作用域的变量(比如fun这个实例本身),但fun.X1是fun实例的属性,并不是全局变量,所以用这种方式根本找不到对应的属性值。

另外还有个小问题:你原代码里setattr(fun, X1, 10)中的X1如果没提前定义,会直接报NameError,应该把它改成字符串形式的属性名(比如'X1')。

正确的解决方法:使用getattr()函数

Python内置的getattr()函数专门用来通过字符串形式的属性名获取对象的属性,完美适配你这种动态访问的场景。

修正后的完整代码

def dofun():
    class Dict:
        pass
    fun = Dict()
    # 把属性名改成字符串,避免未定义变量的错误
    setattr(fun, 'X1', 10)
    setattr(fun, 'X2', 20)
    setattr(fun, 'X3', 30)
    return fun

def main():
    fun = dofun()
    # 循环范围调整为1到4,才能覆盖X1/X2/X3三个属性
    for i in range(1, 4):
        # 用格式化字符串动态生成属性名,通过getattr获取值
        current_attr = getattr(fun, f'X{i}')
        print(current_attr)

if __name__ == "__main__":
    main()

额外优化提示

如果担心循环中出现不存在的属性(比如X4)导致报错,可以给getattr加第三个参数作为默认值,比如:

getattr(fun, f'X{i}', '属性不存在')

这样当属性不存在时会返回你指定的默认值,避免抛出AttributeError。

内容的提问来源于stack exchange,提问作者Tomas Valldeperas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:05:56