首页 > 解决方案 > 如何/为什么全局变量在嵌套类实例中可用/在范围内,但“非局部”变量不可用?

问题描述

如何以与访问OuterClass全局变量类似的方式访问变量?

例如:

global_variable = 'global_variable'

class InnerClass:

    def __init__(self):
        pass

    def test(self):
        return super().variable

    def test_global(self):
        return global_variable


class OuterClass:

    def __init__(self, inner_class_instance):
        self.variable = 'class_variable'
        self.inner_class_instance = inner_class_instance

运行以下返回全局变量:

inner = InnerClass()
outer = OuterClass(inner)
outer.inner_class_instance.test_global()

但是,尝试访问nonlocal类变量会导致AttributeError

outer.inner_class_instance.test()

super()被错误地用于InnerClass.testasOuterClass不是InnerClass. 如何以与访问OuterClass全局变量类似的方式访问变量?那是没有将上下文参数传递给InnerClass. 使用nonlocal variableinInnerClass.test导致SyntaxError.

此外,如何以及为什么可以从 访问全局变量InnerClass.test

标签: pythonpython-3.xclassinheritancenested

解决方案


在 的test(self)方法 中InnerClass, 你 错误 地 理解 了 表达 的 意思super().variable. super()这里指的是 的超类InnerClass,它(即使在代码中没有明确显示)恰好是名为 的预定义类Object。而且Object该类当然没有名为variable. 这就是为什么该行会引发错误

“超级”对象没有属性“变量”

您的另一个问题是——“如何访问OuterClass变量?”。

我想首先清理这里概念的一些基本方面。

首先,你里面的那个东西InnerClass,有名字variable,实际上是 的一个属性InnerClass因此,我宁愿将您的问题重新表述为“如何从方法中访问OuterClass 属性InnerClass?”。

其次,仅仅因为OuterClass接收到执行方法的实例的引用InnerClass__init__()并不OuterClass意味着它OuterClass以任何方式“外部”或“环绕” InnerClass

从 中的代码来看InnerClassOuterClass只是另一个类,没有特殊地位——它既不是超类(祖先类)也不是外部类(周边类)。OuterClass因此,要从InnerClass调用的方法中访问 的实例的属性test(),首先需要一个包含对该OuterClass实例的引用的名称。因此,例如,在test()方法中,如果您碰巧有一个名为 的名称my_outer_inst包含对 的实例的引用OuterClass,那么您当然可以使用来OuterClass引用名为 的属性。variablemy_outer_inst.variable


推荐阅读