当前位置: 首页 > 面试题库 >

在类块中定义的名称范围不会扩展到方法的块。这是为什么?

闾丘德业
2023-03-14
问题内容

阅读文档时,我遇到了以下段落:

范围定义了块中名称的可见性。如果在块中定义了局部变量,则其范围将包括该块。如果定义出现在功能块中,则范围将扩展到定义块中包含的任何块,除非所包含的块为名称引入了不同的绑定。
在类块中定义的名称范围仅限于该类块。 它没有扩展到方法的代码–这包括理解和生成器表达式,因为它们是使用函数范围实现的。

我决定尝试自己从一个方法访问类变量:

>>> 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

问题是为什么该语言的开发人员使类变量从方法中不可见?其背后的原理是什么?


问题答案:

这似乎与显式self参数的使用以及所有方法调用和实例属性访问显式使用的要求有关self。如果不常见的情况是将类范围函数作为普通函数访问,比通过方法将其作为方法访问的普通情况要容易得多,那至少是奇怪的self。通常也可以通过Python中的实例访问类变量。

相比之下,在C ++中,类范围在所有方法中都是可见的,但是隐式调用pass方法this。这似乎是另一个理智的选择。



 类似资料:
  • 我正在创建一个带有两个滑块(实际上是三个)的自定义表单,因为我将两个滑块转换为一个范围滑块。 我正在使用。 使用JS,我为自定义范围滑块添加了一些限制。 代表最大值的输入值不能小于最小值 最小值和最大值的起始值分别为0和100 现在,由于某些原因,当您将最小值调整到大于100,然后将其更改回小于100时,自定义范围滑块会中断 更新:或者一旦最小值设置为8或更高-_- 最大值设置为(最小值100),

  • 我有以下html: 我试图获得如下范围: 但我收到:。 我是angularJS初学者,我只是不明白为什么这不起作用。 更新:这也不起作用: 更新2:我试图在控制台中打印出作用域的所有代码:

  • 问题内容: 当我在node.js模块中执行此操作时: 去哪儿了?我的意思是:在浏览器中(如果未在函数中执行或以其他方式执行) 如果我执行此操作: 然后可以在中找到它,但这不是我想要的。 问题答案: 与浏览器不同,浏览器默认情况下将变量分配给全局空间(即窗口),而在Node中, 除非您 将变量 明确 分配给module.exports, 否则 变量的作用域为模块(文件)。 实际上,当您运行或文件中的

  • 本文向大家介绍Laravel框架中扩展函数、扩展自定义类的方法,包括了Laravel框架中扩展函数、扩展自定义类的方法的使用技巧和注意事项,需要的朋友参考一下 一、扩展自己的类 在app/ 下建立目录 libraries\class  然后myTest.php 类名格式 驼峰 myTest 在 app/start/global.php 用 make 载入 二、扩展自己的函数 在app/ 下建立目录

  • 我试图找出使用PHP从一系列IP地址中获取单个/24 IP块的最佳/最有效的方法。 我有一个MySQL数据库中的IP地址范围(我不能改变这是如何呈现的),必须有单独的范围的 /24块保存,也以特定的方式(我不能改变MySQL条目,也不能改变软件如何处理列表)。 例如,我有各种范围的IPv4 IP地址在这种格式: 我需要将其保存为此特定格式,以表示给定地址范围内的每个/24块: 我对如何在不写非常复

  • 我正在写一个Spring MVC,并坚持以下错误: 18:34:44999警告[org.springframework.web.context.support.XmlWebApplicationContext](MSC服务线程1-1)在上下文初始化过程中遇到异常-取消刷新尝试:org。springframework。豆。工厂BeanCreationException:创建名为“org”的bean时