Python面向对象实现电网节点房屋增删时的字典操作错误排查
解决电网房屋管理程序的AttributeError及逻辑完善
1. 揪出AttributeError的根源
AttributeError: 'dict' object has no attribute 'add_house'这错的核心原因:你在PowerGrid类中存储的不是Propagator实例,而是从CSV读入的原始字典数据。调用add_house时,自然会因为操作的是字典而非Propagator对象报错。
2. 核心类的修正代码
直接给你补全并修正后的三个核心类,覆盖了房屋增删、CSV加载的完整逻辑:
House类
class House: def __init__(self, house_id, address, owner): self.house_id = house_id self.address = address self.owner = owner def __repr__(self): return f"House({self.house_id}, '{self.address}', '{self.owner}')"
Propagator类
class Propagator: def __init__(self, prop_id, location, capacity): self.prop_id = prop_id self.location = location self.capacity = capacity self.houses = [] # 存储关联的House实例 def add_house(self, house): # 防重复添加+容量校验 if house not in self.houses and len(self.houses) < self.capacity: self.houses.append(house) return True return False def remove_house(self, house_id): # 根据house_id精准移除房屋 for idx, house in enumerate(self.houses): if house.house_id == house_id: del self.houses[idx] return True return False def __repr__(self): return f"Propagator({self.prop_id}, '{self.location}', {self.capacity}, houses={self.houses})"
PowerGrid类
import csv class PowerGrid: def __init__(self): self.propagators = {} # key: prop_id,value: Propagator实例 def add_propagator(self, prop_data): # 必须将字典数据转为Propagator实例后再存储 propagator = Propagator( prop_id=prop_data['prop_id'], location=prop_data['location'], capacity=int(prop_data['capacity']) ) self.propagators[propagator.prop_id] = propagator def load_propagators_from_csv(self, csv_path): # 从CSV加载数据并自动实例化Propagator with open(csv_path, 'r', encoding='utf-8') as f: reader = csv.DictReader(f) for row in reader: self.add_propagator(row) def add_house_to_propagator(self, prop_id, house): # 先校验节点是否存在 if prop_id not in self.propagators: raise ValueError(f"电网节点 {prop_id} 不存在") # 调用节点自身的add_house方法 return self.propagators[prop_id].add_house(house) def remove_house_from_propagator(self, prop_id, house_id): if prop_id not in self.propagators: raise ValueError(f"电网节点 {prop_id} 不存在") return self.propagators[prop_id].remove_house(house_id) def get_propagator_houses(self, prop_id): if prop_id not in self.propagators: raise ValueError(f"电网节点 {prop_id} 不存在") return self.propagators[prop_id].houses
3. 关键修复点
- 修正
add_propagator方法:不再直接存储CSV读取的字典数据,而是先将数据实例化为Propagator对象后再存入容器,彻底解决AttributeError。 - 封装房屋增删逻辑:把房屋的添加、移除逻辑放在
Propagator类内部,PowerGrid仅负责路由到对应的节点实例,职责划分更清晰。 - 完善CSV加载逻辑:确保从CSV读取的每一行数据都正确转化为
Propagator实例,而非原始字典。
4. 测试用例
# 初始化电网 grid = PowerGrid() # 加载CSV(需确保CSV表头为prop_id,location,capacity) grid.load_propagators_from_csv('propagators.csv') # 创建房屋实例 house1 = House("H001", "主街123号", "张三") house2 = House("H002", "橡树大道456号", "李四") # 给节点P001添加房屋 grid.add_house_to_propagator("P001", house1) grid.add_house_to_propagator("P001", house2) # 查看节点P001关联的房屋 print(grid.get_propagator_houses("P001")) # 移除节点P001下的房屋H001 grid.remove_house_from_propagator("P001", "H001") print(grid.get_propagator_houses("P001"))
5. CSV格式要求
确保你的CSV文件表头与Propagator的初始化参数对应,示例内容:
prop_id,location,capacity P001,市中心,5 P002,郊区,10
内容的提问来源于stack exchange,提问作者Debadri Dutta
相关产品推荐
相关产品推荐

