python - 如何/为什么全局变量在嵌套类实例中可用/在范围内,但“非局部”变量不可用?
问题描述
如何以与访问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.test
asOuterClass
不是InnerClass
. 如何以与访问OuterClass
全局变量类似的方式访问变量?那是没有将上下文参数传递给InnerClass
. 使用nonlocal variable
inInnerClass.test
导致SyntaxError
.
此外,如何以及为什么可以从 访问全局变量InnerClass.test
?
解决方案
在 的test(self)
方法 中InnerClass
, 你 错误 地 理解 了 表达 的 意思super().variable
. super()
这里指的是 的超类InnerClass
,它(即使在代码中没有明确显示)恰好是名为 的预定义类Object
。而且Object
该类当然没有名为variable
. 这就是为什么该行会引发错误
“超级”对象没有属性“变量”
您的另一个问题是——“如何访问OuterClass
变量?”。
我想首先清理这里概念的一些基本方面。
首先,你里面的那个东西InnerClass
,有名字variable
,实际上是 的一个属性。InnerClass
因此,我宁愿将您的问题重新表述为“如何从方法中访问OuterClass
属性InnerClass
?”。
其次,仅仅因为OuterClass
接收到执行方法的实例的引用InnerClass
,__init__()
并不OuterClass
意味着它OuterClass
以任何方式“外部”或“环绕” InnerClass
。
从 中的代码来看InnerClass
,OuterClass
只是另一个类,没有特殊地位——它既不是超类(祖先类)也不是外部类(周边类)。OuterClass
因此,要从InnerClass
调用的方法中访问 的实例的属性test()
,首先需要一个包含对该OuterClass
实例的引用的名称。因此,例如,在test()
方法中,如果您碰巧有一个名为 的名称my_outer_inst
包含对 的实例的引用OuterClass
,那么您当然可以使用来OuterClass
引用名为 的属性。variable
my_outer_inst.variable
推荐阅读
- python - 第一次添加值后如何重置功能
- php - 无法从 Mailgun API 检索国家、提供商或设备标签统计信息
- firebird - 如何在 FIrebird fdb python 库中设置 set_stream_blob_threshold?
- python - 将 Python 中的数据框插入到雪花中
- amazon-web-services - 如何按日期将文件子集从一个 S3 存储桶文件夹复制到另一个
- java - 如何将 Android 日历设置为航海或军事时区
- c# - 指定类型的某些属性
- chocolatey - 在 Windows 7 64 位上安装巧克力时出错
- python-3.x - 在没有指定协议的情况下打开网页时出现 Selenium InvalidArgumentException (http/https)
- python - 使用 Django 的 AJAX 调用正在将响应打印到空白页