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
相关产品推荐
相关产品推荐

