命名空间和类变量

  • 获取类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()会报错

你可能感兴趣的:(命名空间和类变量)