Python中如何通过对象属性更新构造函数初始化的列表?
问题分析与解决
问题根源
- 类属性共享问题:原代码里的
list是类属性,所有Person实例会共用同一个列表,这不符合每个实例维护独立列表的需求。 - 属性赋值无联动:直接给
a.name赋值时,只是单纯修改了实例的name属性,没有触发向list添加新值的逻辑——只有初始化时把默认的Zed加进了列表。
解决方法
要实现修改name时自动把新值加入list,需要做两个关键改动:
- 把类属性
list改成实例属性,让每个对象拥有独立的列表; - 使用
@property装饰器给name属性添加setter方法,在赋值时自动执行添加操作。
修正后的代码
class Person: def __init__(self, name="Zed"): # 改为实例属性,每个对象有自己的列表 self._list = [] # 用属性赋值触发setter,初始化时就把默认值加进去 self.name = name @property def name(self): return self._name @name.setter def name(self, value): self._name = value # 赋值时自动把新name加入列表 self._list.append(value) def printList(self): print(self._list) a = Person() a.name = "Yasuo" a.printList() # 现在输出 ['Zed', 'Yasuo']
补充说明
如果只希望列表里保留最新的name值(而非记录所有修改过的name),可以在setter里先清空列表再添加:
@name.setter def name(self, value): self._name = value self._list.clear() self._list.append(value)
这样执行a.name = "Yasuo"后,printList()会输出['Yasuo'],完全符合你最初的期望。
内容的提问来源于stack exchange,提问作者TheRi
相关产品推荐
相关产品推荐

