Python中Marathon类register方法访问构造函数字典报错求助
解决NameError:访问类实例字典的正确方式
你遇到的问题核心在于:__init__方法里定义的my_marathon是局部变量,它的作用范围只限于__init__方法内部,类的其他方法(比如register)根本"看不到"它。要让跨方法都能访问这个字典,必须把它定义成实例属性——也就是给它加上self.前缀。
另外还要提醒你一个小错误:你写的{'runner', 'time'}是集合(set)的语法,不是字典(dict)。字典的格式是{键: 值},如果要存储多个跑步者和他们的完赛时间,初始应该用空字典{}来定义。
修正后的完整代码示例
class Marathon: def __init__(self): """Set up this marathon without any runners.""" # 用self.将字典声明为实例属性,初始化为空 self.my_marathon = {} def register(self, runner_name, finish_time): """注册跑步者及其完赛时间""" # 通过self.访问实例属性my_marathon,添加键值对 self.my_marathon[runner_name] = finish_time # 测试功能 my_event = Marathon() my_event.register("Alice", 125) my_event.register("Bob", 142) print(my_event.my_marathon) # 输出: {'Alice': 125, 'Bob': 142}
关键逻辑说明
self是类实例的指代,在类的所有方法中,只要用self.xxx定义的属性,就能被同一个实例的其他方法访问、修改。- 字典的初始化:如果一开始没有预设的跑步者数据,用
{}创建空字典是最合理的,后续通过register方法动态添加键值对即可。
内容的提问来源于stack exchange,提问作者miCruQue




