首页 > 代码库 > 飘逸的python - 作用域与lookup策略
飘逸的python - 作用域与lookup策略
首先了解什么是命名空间,命名空间是一个”命名->对象“的映射,在python中用dict实现的。
而作用域,是指能直接访问到的命名空间。
当我们访问一个变量时,会按LEGB的顺序来lookup:
- L->Local. 即局部变量,比如定义在def或lambda中的变量。
- E-> Enclosing function locals. 即闭包中的变量。
- G->Global (module).全局变量。
- B->Built-in .内置变量,比如len()/KeyError等。
当我们通过实例即self.x访问一个属性时,它的lookup顺序是:
- 实例属性
- 类属性
- 父类属性.按MRO(method resolution order)
给个栗子更直观点。
s = 'global' class Foo(object): s = 'class' def __init__(self): print s #全局变量,输出global print Foo.s #类属性,输出class print self.s #实例属性中没找到,于是到类属性中找,输出class self.s = 'instance'#创建了个实例属性 print self.s #实例属性能找到,输出instance Foo()
飘逸的python - 作用域与lookup策略
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。