码迷,mamicode.com
首页 > 编程语言 > 详细

飘逸的python - 作用域与lookup策略

时间:2014-11-23 07:04:21      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   os   sp   for   strong   

首先了解什么是命名空间,命名空间是一个”命名->对象“的映射,在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)
给个栗子更直观点。
    1. s = ‘global‘  
    2. class Foo(object):  
    3.    s = ‘class‘  
    4.    def __init__(self):  
    5.       print s #全局变量,输出global  
    6.       print Foo.s #类属性,输出class  
    7.       print self.s #实例属性中没找到,于是到类属性中找,输出class  
    8.       self.s = ‘instance‘#创建了个实例属性  
    9.       print self.s #实例属性能找到,输出instance  
    10.   
    11. Foo() 

飘逸的python - 作用域与lookup策略

标签:style   blog   http   io   ar   os   sp   for   strong   

原文地址:http://www.cnblogs.com/yuyanbian/p/4116117.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!