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

Python中Inner Class(内部类)如何访问Outer Class(外部类)的变量

Python内部类访问外部类变量的实现方法与注意事项

核心实现方法

方法1:传递外部类实例引用(可访问实例属性+类属性)

这是最通用的实现方式,适合需要访问外部类实例级变量的场景:

class Outer:
    # 外部类类变量
    outer_cls_attr = "外部类类属性"
    def __init__(self):
        # 外部类实例变量
        self.outer_ins_attr = "外部类实例属性"
        # 初始化内部类时传入当前外部类实例self
        self.inner = self.Inner(outer_instance=self)

    class Inner:
        def __init__(self, outer_instance):
            # 存储外部类实例引用,后续通过该引用访问外部类属性
            self.outer = outer_instance
        
        def get_outer_attrs(self):
            # 访问外部类实例属性
            print(self.outer.outer_ins_attr)
            # 访问外部类类属性
            print(self.outer.outer_cls_attr)
            # 也可以直接通过类名访问外部类类属性
            print(Outer.outer_cls_attr)

# 测试代码
outer = Outer()
outer.inner.get_outer_attrs()

方法2:直接通过外部类类名访问(仅可访问类属性)

如果不需要访问外部类的实例属性,只需要访问类属性、类方法或静态方法,可以直接通过外部类的类名调用,不需要传递实例引用:

class Outer:
    outer_cls_attr = "外部类类属性"
    @classmethod
    def outer_cls_method(cls):
        return "外部类类方法返回值"

    class Inner:
        def get_outer_cls_attrs(self):
            print(Outer.outer_cls_attr)
            print(Outer.outer_cls_method())

# 测试代码
inner = Outer.Inner()
inner.get_outer_cls_attrs()

注意事项

  • 内部类默认不持有外部类实例的引用,必须手动传递才能访问实例属性,直接在内部类中调用self.xxx访问外部类属性会抛出AttributeError。
  • 注意循环引用问题:外部类持有内部类实例、内部类又持有外部类实例的场景下,如果类中自定义了__del__析构方法,会导致Python的垃圾回收器无法自动回收这部分对象,引发内存泄漏。这种场景建议使用weakref库创建弱引用存储外部类实例,避免强引用循环。
  • 内部类的作用域和外部类完全独立,两者的同名属性不会互相覆盖,除非你主动通过持有的外部类/内部类引用访问对应属性。
  • 不建议使用超过2层的嵌套类结构,过深的嵌套会大幅降低代码可读性,也会提高属性访问的出错概率,这种场景优先用类组合替代嵌套。

内容的提问来源于stack exchange,提问作者Teja Ambati

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:45:02