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

Python创建嵌套字典时出现AttributeError: 'Pathway' object has no attribute 'hidden'错误求助

Python创建嵌套字典时出现AttributeError: 'Pathway' object has no attribute 'hidden'错误求助

问题描述

你尝试通过定义类来自动构建嵌套的world字典结构,但运行代码时遇到了AttributeError: 'Pathway' object has no attribute 'hidden'的错误。你期望的world是分层结构:包含多个Location,每个Location下有rooms列表和alignment属性;每个Room有hidden状态和pathways列表;每个Pathway包含hidden和travelType属性。

错误原因分析

你的核心问题出在类的初始化逻辑上。拿Pathway类举例,你试图用self.hidden作为字典的键,但self(当前的Pathway实例)根本没有hidden这个属性——你真正想用来当键的是字符串"hidden",而不是实例的未定义属性。Room、Location类也犯了同样的错误:误用self.hidden、self.pathways这类未定义的实例属性作为字典键,而非直接使用字符串键名。

另外,你的类继承了dict,但初始化时却额外创建了self.dict属性,这完全没必要——既然继承了dict,应该直接把键值对绑定到实例本身,或者换更简单的方式生成字典。

修正后的代码方案

这里给你两种可行的修正思路,你可以根据需求选择:

方案一:正确继承并初始化dict类

如果想保留类继承dict的方式,应该直接在初始化时把键值对添加到实例本身,而不是创建额外的self.dict属性:

class Pathway(dict):
    def __init__(self, hidden, travel_type):
        # 直接把键值对初始化到dict实例中
        super().__init__({
            "hidden": hidden,
            "travelType": travel_type
        })

class Room(dict):
    def __init__(self, hidden, pathways):
        super().__init__({
            "hidden": hidden,
            "pathways": pathways
        })

class Location(dict):
    def __init__(self, rooms, alignment):
        super().__init__({
            "alignment": alignment,
            "rooms": rooms
        })

# 实例化对象
p1 = Pathway(True, "teleport")

void_room = Room(True, [p1])
village_entrance = Room(False, [p1])

void = Location([void_room], "neutral")
village = Location([village_entrance], "good")

# 构建目标world字典
world = {
    "void": void,
    "village": village
}

def location_data_retrieval(path):
    return world.get(path)

# 测试输出
print(world)

方案二:不继承dict,直接生成字典(更简洁)

如果你的类只是用来生成特定结构的字典,其实没必要继承dict,直接在类里存储结构化字典即可,逻辑会更清晰:

class Pathway:
    def __init__(self, hidden, travel_type):
        self.data = {
            "hidden": hidden,
            "travelType": travel_type
        }

class Room:
    def __init__(self, hidden, pathways):
        # 把Pathway实例转成字典存入列表
        self.data = {
            "hidden": hidden,
            "pathways": [p.data for p in pathways]
        }

class Location:
    def __init__(self, rooms, alignment):
        # 把Room实例转成字典存入列表
        self.data = {
            "alignment": alignment,
            "rooms": [r.data for r in rooms]
        }

# 实例化
p1 = Pathway(True, "teleport")

void_room = Room(True, [p1])
village_entrance = Room(False, [p1])

void = Location([void_room], "neutral")
village = Location([village_entrance], "good")

# 构建符合预期的world字典
world = {
    "void": void.data,
    "village": village.data
}

def location_data_retrieval(path):
    return world.get(path)

# 测试输出
print(world)

效果说明

修正后的代码运行后,world字典会完全符合你预期的嵌套结构,比如world["village"]会包含alignment: "good",rooms列表里的villageEntrance会有hidden: False和包含目标Pathway的pathways列表。

备注:内容来源于stack exchange,提问作者Phoenix Rise

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 17:34:29