gpt4 book ai didi

python - 类(class)评估顺序?

转载 作者:太空宇宙 更新时间:2023-11-04 10:34:33 24 4
gpt4 key购买 nike

在文件 lib.py 中,我定义了一个函数类 C 和一个枚举类 E,如下所示:

class C:
a = None
def meth(self, v):
if v == E.v1:
print("In C.meth().v1")
a = E.v1
if v == E.v2:
print("In C.meth().v2")
a = E.v2


from enum import Enum
class E(Enum):
print("In Enum")
v1 = 1
v2 = 2

然后,我将这两个类导入我的模块 main.py 并使用枚举:

from lib import C
from lib import E

c = C()
c.meth(E.v1)

运行时,我得到以下输出:

In Enum
In C.meth().v1

现在,由于 Python 是一种解释型语言(至少,在使用 IDLE 时),我希望在方法 meth 中引用枚举时会出现错误。由于没有错误,而且似乎运行正常,我想知道在同一模块中以及不同模块之间引用类的(排序)规则是什么?为什么没有报错?

最佳答案

名称查找发生在运行时。因此,当您定义类 C 及其方法 meth 时,对 E 的查找尚未完成。所以你在之后定义它不是问题。相反,查找会在您调用该方法时发生。

此外,名称查找通过向上作用域进行,因此 meth 将找到在模块级别声明的原始 E,无论您是否在 中导入它>main.py 与否。由于您还在 main.py 中导入了 E,这是对相同 对象的引用,因此您也可以在其中引用相同的枚举值.

另见这个例子:

>>> def test(): # foo is not defined at this time
print(foo)
>>> test()
NameError: global name 'foo' is not defined
>>> foo = 'bar' # after defining foo, it works:
>>> test()
bar

在定义方法时,变量永远不会“嵌入”;这些方法只包含名称,这些名称在运行时查找。然而,由于 Python 的查找方式,局部变量的名称始终“存在”,即使它们尚未初始化。这可能导致 UnboundLocalError:

>>> def test():
print(foo)
foo = 'baz'
>>> test()
UnboundLocalError: local variable 'foo' referenced before assignment

人们可能期望 foo 会在第一次打印时在外部作用域中查找,但是因为有一个本地 foo(即使它没有被初始化yet),foo 将始终*解析为本地 foo

(* nonlocal 语句允许使 foo 成为非本地的,将其解析到外部作用域——同样适用于所有 foo 在该方法中。)

关于python - 类(class)评估顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24251076/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com