飘逸的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()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值