由于某些原因,当发生这种情况时python从全局名称空间获取变量:
class Cls:
foo = foo
请查看以下代码:
foo = 'global'
def func0():
foo = 'local'
class Cls:
bar = foo
print('func0', Cls.bar)
func0()
# func0 local
def func1():
foo = 'local'
class Cls:
foo = foo
print('func1', Cls.foo)
func1()
# func1 global
def func2():
foo = 'nonlocal'
def internal():
class Cls:
foo = foo
print('func2.internal', Cls.foo)
internal()
func2()
# func2.internal global
def func3():
foo = 'local'
class Cls:
bar = foo
foo = foo
print('func3', Cls.bar, Cls.foo)
func3()
# func3 global global
符合PEP 227
类定义是可执行的语句,可能包含名称的使用和定义。这些参考遵循名称解析的常规规则。类定义的名称空间成为该类的属性字典。
但对我来说,它根本不像是“遵循正常规则”。我想念什么?
Py2和Py3都以这种方式工作。
答案 0 :(得分:6)
在Execution model - Resolution of names中有记录:
类定义块[...]很特殊 在名称解析中。类定义是可执行文件 可以使用和定义名称的语句。这些参考文献遵循 名称解析的常规规则,但未绑定本地 在全局命名空间中查找变量。
(重点是我的)