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

如何在getattr()中使用循环变量遍历Person类对象的level属性?

解决方案

当然可以用循环变量遍历所有实例,而且有更优雅可靠的实现方式,下面分场景说明:

1. 修复现有代码:直接遍历实例对象列表

如果你的people_list目前存的是实例名称字符串(比如["p1", "p2", "p3"]),这种方式非常不推荐——因为你需要从命名空间中通过字符串取变量,容易出错且依赖环境。正确的做法是把实例对象本身存入列表:

class Person:
    def __init__(self, name, level):
        self.name = name
        self.level = level

# 创建实例
p1 = Person("Alice", 5)
p2 = Person("Bob", 3)
p3 = Person("Charlie", 7)

# 存储实例对象而非字符串
people_list = [p1, p2, p3]

# 把遍历逻辑放在类内作为静态方法
@staticmethod
def lvlFinder(people):
    for person in people:
        print(f"{person.name} 的 level: {person.level}")

# 调用函数
Person.lvlFinder(people_list)

2. 更优实现:让类自动跟踪所有实例

手动维护实例列表容易遗漏,更可靠的方式是让Person类自身通过类属性记录所有创建的实例,无需外部手动维护:

class Person:
    # 类属性,用于存储所有Person实例
    _all_instances = []

    def __init__(self, name, level):
        self.name = name
        self.level = level
        # 实例化时自动将自身加入类的实例列表
        Person._all_instances.append(self)

    @classmethod
    def lvlFinder(cls):
        # 遍历类中存储的所有实例
        for person in cls._all_instances:
            print(f"{person.name} 的 level: {person.level}")

# 创建实例时无需手动维护列表
p1 = Person("Alice", 5)
p2 = Person("Bob", 3)
p3 = Person("Charlie", 7)

# 直接调用类方法即可打印所有实例的level
Person.lvlFinder()

为什么不推荐通过字符串变量名取实例?

如果坚持用getattr结合字符串变量名,需要从全局/局部命名空间中获取对象,比如:

# 不推荐的写法
people_list = ["p1", "p2", "p3"]
for name in people_list:
    person = getattr(globals(), name)
    print(person.level)

这种方式依赖变量名的正确性,一旦变量被删除或重命名就会报错,而且代码可读性差,维护成本高,完全没必要使用。

内容的提问来源于stack exchange,提问作者v1sor1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:15:41