我想知道为什么如果未定义名称,类的方法不会查看其封闭范围。
def test_scope_function():
var = 5
def print_var():
print(var) # finds var from __test_scope_function__
print_var()
globalvar = 5
class TestScopeGlobal:
var = globalvar # finds globalvar from __main__
@staticmethod
def print_var():
print(TestScopeGlobal.var)
class TestScopeClass():
var = 5
@staticmethod
def print_var():
print(var) # Not finding var, raises NameError
test_scope_function()
TestScopeGlobal.print_var()
TestScopeClass.print_var()
我希望TestScopeClass.print_var()
能够打印5
,因为它可以在classvar
正文中阅读TestScopeClass
。
为什么会这样?我应该在docs中阅读什么来了解它。
答案 0 :(得分:6)
搜索范围as follows:
- 首先搜索的最里面的范围包含本地名称
- 从最近的封闭范围开始搜索的任何封闭函数的范围包含非本地名称,但也包含非全局名称
- 倒数第二个范围包含当前模块的全局名称
- 最外层范围(最后搜索)是包含内置名称的命名空间
(重点补充)。不会搜索包含类,因为它们未列出。这种行为是故意的,因为除了其他方面为方法提供self
参数之外,descriptor protocol将无法触发。
答案 1 :(得分:3)
Per the Python documentation(强调我的):
类块中定义的名称范围仅限于类块; 不会扩展到方法的代码块