如何从列表初始化类属性?无需逐个显式赋值的实现方法
从列表批量初始化类属性的方法
当然有办法不用逐个显式赋值,给你几种实用的实现方式:
方法一:用setattr结合属性名列表
提前把要赋值的属性按顺序列成列表,然后遍历列表和传入的元素,用setattr批量赋值,代码更简洁,后续加属性也只需修改列表:
class TestClass: def __init__(self): self.first = None self.second = None def initialise_from_list(self, l): # 按属性对应列表元素的顺序定义属性名 attr_names = ['first', 'second'] for name, value in zip(attr_names, l): setattr(self, name, value) print(self.first, self.second) t = TestClass() t.initialise_from_list(l=[1,2])
方法二:用类变量维护属性顺序
把属性名存在类变量里,初始化和赋值逻辑都能复用,维护性更好:
class TestClass: # 类层面定义属性顺序,统一管理 _PROPERTY_ORDER = ['first', 'second'] def __init__(self, l=None): # 先把所有属性初始化为None for prop in self._PROPERTY_ORDER: setattr(self, prop, None) # 如果传入列表就直接赋值 if l: self.initialise_from_list(l) def initialise_from_list(self, l): for prop, value in zip(self._PROPERTY_ORDER, l): setattr(self, prop, value) print(self.first, self.second) t = TestClass(l=[1,2])
方法三:转字典后更新实例__dict__
如果属性和列表元素严格对应,也可以把属性名和元素配对成字典,直接更新实例的__dict__,但要注意过滤掉不需要赋值的属性:
class TestClass: def __init__(self): self.first = None self.second = None self.extra_attr = "不用赋值的属性" def initialise_from_list(self, l): attr_names = ['first', 'second'] # 生成属性名-值的字典 prop_dict = dict(zip(attr_names, l)) # 批量更新实例属性 self.__dict__.update(prop_dict) print(self.first, self.second, self.extra_attr) t = TestClass() t.initialise_from_list(l=[1,2])
注意事项
- 要确保传入的列表长度和属性数量一致,避免部分属性没赋值或者元素被忽略,也可以加个判断:
if len(l) != len(attr_names): raise ValueError("列表长度和属性数量不匹配") - 属性名列表的顺序必须和传入列表元素的顺序严格对应,不然会出现赋值错位的问题
内容的提问来源于stack exchange,提问作者tandem
相关产品推荐
相关产品推荐

