Python中在__init__方法内为类实例动态分配属性的方法
解决Python类动态分配属性的问题
嘿,我懂你的困扰!你现在的代码里self.key = value其实是把字符串'key'固定当成了属性名,而不是循环中每次迭代的key变量对应的实际字典键(也就是'a'和'b')。要实现把字典的键作为对象属性名动态分配,有两种常用且靠谱的方法:
方法一:使用setattr()函数(推荐)
这是Python官方推荐的动态设置属性的方式,既规范又能应对大多数场景,包括类使用__slots__的情况。
修改后的代码如下:
class P: def __init__(self, field): # 假设你的func方法返回处理后的键值对,这里保持你的循环逻辑 for key, value in self.func(field): setattr(self, key, value) # 补充func方法的示例(如果有自定义逻辑可以修改这里) def func(self, field): # 这里可以添加对field的处理,比如过滤、转换键名等 return field.items() field = {'a' : 1, 'b' : 2} obj = P(field) print(obj.a) # 输出 1 print(obj.b) # 输出 2
setattr(self, key, value)的作用很明确:把当前对象self的key变量对应的名称作为属性名,赋值为value。循环时每次的key是字典里的'a'、'b',自然就会创建对应的属性。
方法二:直接操作对象的__dict__属性
Python对象的实例属性默认存储在__dict__这个字典里,所以你也可以直接给它赋值:
class P: def __init__(self, field): for key, value in self.func(field): self.__dict__[key] = value def func(self, field): return field.items()
不过要注意:如果你的类定义了__slots__,对象不会有__dict__属性,这种方法就失效了,所以还是优先用setattr()更稳妥。
内容的提问来源于stack exchange,提问作者Nitin Kothari
相关产品推荐
相关产品推荐

