如何在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
相关产品推荐
相关产品推荐

