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

Python动态创建类遇AttributeError:类对象无对应属性求助

问题分析与修复

你的代码核心问题是参数名冲突:make_class函数接收的*args是你定义的类属性名列表(比如"name"、"species"),但内部Class的__init__方法又使用了同名的*args,这里的args会覆盖外部的属性名列表,变成实例化时传入的属性值(比如"Bob"、"Dog")。

这导致你的循环实际上是把"Bob"这类属性值当作属性名来绑定,自然找不到name这个正确的属性。

修复后的代码

def make_class(*attr_names):
    class Class:
        def __init__(self, *attr_values):
            # 将属性名与对应属性值一一绑定到实例
            for name, value in zip(attr_names, attr_values):
                setattr(self, name, value)
    return Class

Animal = make_class("name", "species", "age", "health", "weight", "color")
dog1 = Animal("Bob","Dog",5,"good","50lb","brown")
print(dog1.name)  # 输出 Bob

关键改动说明

  • 把make_class的参数名改为*attr_names,彻底避免和__init__的参数重名
  • 使用zip将属性名列表和实例化传入的属性值列表一一配对,正确设置实例属性

可选优化

如果担心属性值数量和属性名数量不匹配,可以在__init__中增加校验:

def __init__(self, *attr_values):
    if len(attr_values) != len(attr_names):
        raise ValueError(f"需传入{len(attr_names)}个属性值,实际传入{len(attr_values)}个")
    for name, value in zip(attr_names, attr_values):
        setattr(self, name, value)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:15:33