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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 21:12:50