功能与方法的范围

时间:2015-02-23 16:55:00

标签: python python-3.x scope

我想知道为什么如果未定义名称,类的方法不会查看其封闭范围。

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中阅读什么来了解它。

2 个答案:

答案 0 :(得分:6)

搜索范围as follows

  
      
  • 首先搜索的最里面的范围包含本地名称
  •   
  • 从最近的封闭范围开始搜索的任何封闭函数的范围包含非本地名称,但也包含非全局名称
  •   
  • 倒数第二个范围包含当前模块的全局名称
  •   
  • 最外层范围(最后搜索)是包含内置名称的命名空间
  •   

(重点补充)。不会搜索包含类,因为它们未列出。这种行为是故意的,因为除了其他方面为方法提供self参数之外,descriptor protocol将无法触发。

答案 1 :(得分:3)

Per the Python documentation(强调我的):

  

类块中定义的名称范围仅限于类块; 不会扩展到方法的代码块