Python中如何从内部类访问外部类的实例变量?
问题原因
你原来的代码里,moveset("slash").move取的是嵌套类本身,不是实例,而且这个嵌套类和moveset的实例没有绑定关系——Python的嵌套类只是挂在外部类的命名空间下,不会自动关联外部类的实例,所以不管是从move类内部还是外部,都访问不到moveset实例的name属性。
解决方案
给你两种可行的写法,按需选择:
方案一:让嵌套类绑定外部类实例
如果一定要用嵌套类,需要在创建内部类实例时,把外部类的实例传进去,让内部类持有引用:
class MoveSet: def __init__(self, move_name): self.name = move_name # 创建内部类实例并传入当前外部类实例 self.move = self.Move(self) class Move: def __init__(self, parent_set): self.parent_set = parent_set def use_move(self, user, target): print(f"发动招式:{self.parent_set.name}") user.attack(target) # 生成招式列表,每个元素是绑定了名称的Move实例 move_list = [MoveSet("slash").move, MoveSet("fireball").move] # 使用招式 move_list[0].use_move(user, target) # 获取招式名称 print(move_list[0].parent_set.name)
方案二:直接定义招式类(更推荐)
Python里很少用嵌套类处理这种场景,直接把招式做成独立类的实例更直观,也避免嵌套的坑:
class Move: def __init__(self, name): self.name = name def use_move(self, user, target): print(f"发动招式:{self.name}") user.attack(target) # 创建招式列表,每个实例自带名称和动作 move_list = [Move("slash"), Move("fireball")] # 使用招式 move_list[0].use_move(user, target) # 获取招式名称 print(move_list[0].name)
总结
方案二更符合Python的惯用写法,代码更简洁易维护。如果坚持用嵌套类,就必须手动建立内部类和外部类实例的关联,像方案一那样传递引用。
内容的提问来源于stack exchange,提问作者Oyavo
相关产品推荐
相关产品推荐

