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

Python:如何通过字符串名称设置对象属性(字典初始化类报错)

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

你遇到的错误是因为普通类实例不支持下标赋值(self[key]这种语法是为实现了__setitem__方法的类型设计的,比如原生字典)。要通过字符串动态设置实例属性,Python提供了两种常用方案:

1. 使用内置setattr()函数

这是最标准、兼容性最好的方法,适用于所有类(包括使用__slots__的类):

class dat:
    def __init__(self, data: dict):
        for key, value in data.items():
            setattr(self, key, value)

setattr(obj, attr_name, value)的作用就是给对象obj设置名为attr_name的属性,值为value,完美匹配你从字典动态赋值的需求。

2. 直接更新实例的__dict__

如果你的类没有使用__slots__限制属性,还可以直接更新实例的属性字典__dict__,写法更简洁:

class dat:
    def __init__(self, data: dict):
        self.__dict__.update(data)

Python普通实例的属性默认存储在__dict__字典中,调用update()方法可以一次性把传入字典的所有键值对转为实例属性。但注意:如果类定义了__slots__,这个方法会失效(因为__slots__会禁用实例的__dict__)。

额外方案:用dataclasses简化实现(Python 3.7+)

如果你的需求是快速创建一个能从字典初始化的“数据类”,可以用标准库的dataclasses模块,甚至不需要自己写__init__:

from dataclasses import dataclass, asdict

@dataclass
class dat:
    name: str
    age: int

# 从字典初始化实例
data_dict = {"name": "Alice", "age": 25}
obj = dat(**data_dict)

# 也可以把实例转回字典
print(asdict(obj))

这种方式适合属性结构固定的场景,如果属性完全动态不确定,还是前两种方法更灵活。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 05:33:24