如何解决在类块中定义的名称范围不会扩展到方法的块这是为什么?
这似乎与显式self
参数的使用以及所有方法调用和实例属性访问显式使用的要求有关self
。如果不常见的情况是将类范围函数作为普通函数访问,比通过方法将其作为方法访问的普通情况要容易得多,那至少是奇怪的self
。通常也可以通过Python中的实例访问类变量。
相比之下,在C ++中,类范围在所有方法中都是可见的,但是隐式调用pass方法this
。这似乎是另一个理智的选择。
解决方法
阅读文档时,我遇到了以下段落:
范围定义了块中名称的可见性。如果在块中定义了局部变量,则其范围将包括该块。如果定义出现在功能块中,则范围将扩展到定义块中包含的任何块,除非所包含的块为名称引入了不同的绑定。
在类块中定义的名称范围仅限于该类块。 它没有扩展到方法的代码块–这包括理解和生成器表达式,因为它们是使用函数范围实现的。
我决定尝试自己从一个方法访问类变量:
>>> class A():
i = 1
def f(self):
print(i)
>>> a = A()
>>> a.i
1
>>> a.f()
Traceback (most recent call last):
File "<pyshell#7>",line 1,in <module>
a.f()
File "<pyshell#4>",line 4,in f
print(i)
NameError: global name 'i' is not defined
我知道i
可以通过显式指向类名来访问变量A.i
:
>>> a = A()
>>> class A():
i = 1
def f(self):
print(A.i)
>>> a = A()
>>> a.f()
1
问题是为什么该语言的开发人员使类变量从方法中不可见?其背后的原理是什么?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。