在for循环中使用Citizen类对象触发AttributeError,如何修复?
修复Citizen类遍历引发的AttributeError问题
咱们先拆解下你遇到的错误:AttributeError: 'str' object has no attribute 'Citizen',这个报错是因为你在print_citizen方法里写了for i in self.Citizen——但self是单个Citizen实例,它根本没有Citizen这个属性,而且你的__iter__方法返回的是iter(self.name),这会把实例变成字符串的迭代器(遍历name的每个字符),完全偏离了你想遍历多个公民实例的需求。
下面是针对性的修复方案,我会一步步说明问题点和修正后的代码:
核心问题梳理
- 没有实例集合容器:你想遍历多个
Citizen对象,但没定义存储这些实例的结构(比如列表),反而错误地尝试访问self.Citizen,这完全不存在。 __iter__逻辑错误:原方法返回的是姓名字符串的迭代器,导致单个实例会被拆成字符遍历,不是你要的遍历实例的逻辑。- 类属性与实例属性混淆:原
colony是类属性,所有实例共享同一个值,应该改成实例属性,让每个公民可以属于不同殖民地。
修正后的完整代码
class Citizen(): type = 'Citizen' # 新增类级别的列表,用来存储所有创建的Citizen实例 all_citizens = [] def __init__(self, name, gender, colonyname='init'): self.name = name self.gender = gender # 将colony改为实例属性,每个公民有独立的殖民地 self.colony = colonyname # 实例创建时自动加入类的实例列表 Citizen.all_citizens.append(self) # 可选:如果需要迭代单个公民的属性,重写__iter__返回属性迭代器 def __iter__(self): yield self.name yield self.gender yield self.colony @classmethod def print_citizens_by_colony(cls, target_colony): # 用类方法遍历所有实例,筛选出指定殖民地的公民 for citizen in cls.all_citizens: if citizen.colony == target_colony: print(f"{citizen.name} | {citizen.type} | {citizen.gender}")
用法示例
1. 创建公民实例
# 创建几个属于不同殖民地的公民 alice = Citizen("Alice", "Female", "ColonyAlpha") bob = Citizen("Bob", "Male", "ColonyAlpha") charlie = Citizen("Charlie", "Male", "ColonyBeta")
2. 打印指定殖民地的公民
# 打印ColonyAlpha的所有公民 Citizen.print_citizens_by_colony("ColonyAlpha")
输出结果:
Alice | Citizen | Female Bob | Citizen | Male
3. 迭代单个公民的属性(可选)
如果需要遍历单个公民的属性,可以直接迭代实例:
for attr in alice: print(attr)
输出结果:
Alice Female ColonyAlpha
为什么这样修复?
- 用类级别的
all_citizens列表统一管理所有实例,解决了“遍历多个公民”的核心需求。 - 将
colony改为实例属性,让每个公民可以有独立的殖民地信息,符合现实逻辑。 - 用类方法
print_citizens_by_colony来处理批量筛选打印,比原实例方法更合理(因为这是类级别的操作,不是单个实例的操作)。
内容的提问来源于stack exchange,提问作者Mohammad
相关产品推荐
相关产品推荐

