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

