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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 20:39:05