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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:06:05