Python中如何在for循环中动态迭代修改类实例的命名属性?
批量更新人员日收入的可行方案
嘿,我来帮你搞定这个问题!你之前写的代码没生效,核心原因是:'self.person_{}'.format(i)只是生成了一个字符串(比如"self.person_1"),你对这个字符串做[1] +=25操作,本质是在改字符串里的第二个字符(也就是'e'),完全没碰self.person1这些实例属性的值,当然不会有效果啦。
下面给你两种解决方案,从适配现有代码的临时修复,到更优的代码重构都有:
方案1:用getattr动态操作现有属性
如果你不想改动已经写好的__init__方法,只想修复daily_income,可以用Python内置的getattr()函数来动态获取每个personX属性,修改后更新即可:
def daily_income(self): # 这里的range范围要对应你实际的人员数量,比如有3个就写range(1,4) for i in range(1, 3): # 动态获取self.person1、self.person2这类属性 person_info = getattr(self, f'person{i}') # 给第二个元素(收入)加25 person_info[1] += 25 # 注:因为列表是可变对象,修改后原属性已经同步更新,下面这行可以省略,写出来只是更清晰 setattr(self, f'person{i}', person_info)
这个方法不需要改动你现有的类初始化逻辑,直接替换daily_income方法就能用。
方案2:重构类结构(更推荐的长期方案)
其实一开始把每个人员做成独立的person1、person2属性,本身就不利于批量操作。更好的做法是把所有人员信息放到一个列表或字典里,后续维护和操作都会更简单:
用列表存储的重构示例:
class PersonCollection: def __init__(self): # 把所有人员信息存在一个列表里,新增人员直接append就行 self.people = [ ["Person_1", 0], ["Person_2", 0], # 后续加人直接在这里追加 ] def daily_income(self): # 直接遍历列表,批量更新每个人的收入 for person in self.people: person[1] += 25
这种方式代码更简洁,后续要加新人员,只需要在self.people里加元素,完全不用改daily_income方法,扩展性拉满。
如果需要按名称快速查找人员:
要是你经常需要根据人名(比如"Person_1")单独操作,用字典存储会更方便:
class PersonCollection: def __init__(self): self.people = { "Person_1": 0, "Person_2": 0, } def daily_income(self): # 遍历字典的键,批量更新收入 for name in self.people: self.people[name] += 25
这样既支持批量更新,也能随时通过self.people["Person_1"]直接访问或修改特定人员的收入。
内容的提问来源于stack exchange,提问作者Benjy Bret Barlow
相关产品推荐
相关产品推荐

