美文网首页
命名空间和类变量

命名空间和类变量

作者: W_I_S_E | 来源:发表于2017-02-25 14:31 被阅读0次
    • 获取类C的命名空间 C.dict

    • 获取类C的实例c的命名空间 c.dict

    • 获取函数f的命名空间 在内部使用locals()

    • 获取module的命名空间 globals()

    事实上,命名空间就是存储name和对象的对应关系的,那么当我们通过一个name来获取一个对象的时候,其查找命名空间的顺序在Python中是遵循LEGB的原则的。

    (LEGB:Local -> Enclosing Function -> Global -> Builtins)

    也就是说,遇到一个name的时候,Python解释器首先会去Local本地命名空间中查找,然后再去其所在函数的作用域中查找,如果还没找到,就会去Global全局命名空间中查找,最后会去__builtin__(Python-builtinbuiltins的区别与关系(超详细,经典))这个模块中去查找。

    供测试代码:

    x = 1234
    
    __builtins__.s = 'Hello, World!'
    
    y = 'c'
    test = '1'
    
    
    def test():
        y = 'abc'
        print(x)
        print(y)
        print(s)
        print(locals())
    
    
    test()
    print(test)
    
    
    var = 0
    
    out_function = 1
    
    
    def out_function():
        var = 1
    
        def inner_function():
            print(var)
            print(globals())
    
        print(locals())
        inner_function()
    
    
    print(out_function)
    out_function()
    
    

    在上面的代码中,遵循LEGB原则,譬如输出var,inner_function的local()没有,然后在包裹它的封闭函数内找。

    注意:inner_function在out_function的locals()中.out_function在globals()中,也就是说它和前一个out_function是平级的,所以后一个会覆盖前一个;如果把前一个移到后面,则调用out_function()会报错

    相关文章

      网友评论

          本文标题:命名空间和类变量

          本文链接:https://www.haomeiwen.com/subject/zjtnwttx.html