python中的__all__与__import__

__all__


  __all__属性由列表构成,它规定了模块的所有可见方法,会使属性列表之外的成员全部私有化。

  只有在执行语句 from module import * 时,__all__属性才会起作用。此时所有枚举的成员被import,而其他成员被私有化。


__import__


  __import__(name, globals={}, locals={}, fromlist=[], level=-1) -> module,各个参数的作用见 help(__import__)

  import关键词的实现依赖于__import__函数。了解了import的使用方式能够更好的理解__import__函数的使用。

  模块导入方式通常如下:

  • import pgk
  • import pkg.module1
  • from pkg import module1,module2,...
  • from module1 import func1,func2
  • from pkg.module1 import submodule1
  1、import pkg
[python]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. __import__('pkg')  
  2、import pkg.module1
[python]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. pkg = __import__('pkg.module1',fromlist=[])  
  2. pkg.module1  
  3. #__import__会导入所有以'.'分割的模块,比如本例中pkg和module1都会被导入 。但是当fromlist为[]时,__import__只会最左边的模块作为返回值,此处是pkg。  
  3、from pkg import module1,module2
[python]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. pkg = __import__('pkg',fromlist=['module1','module2'])  
  2. module1 = pkg.module1  
  3. module2 = pkg.module2  
  4、from module1 import func1,func2
[python]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. module1 = __import__('module1',fromlist=['func1','func2'])  
  2. func1 = module1.func1  
  3. func2 = module1.func2  
  4. #可以调用module1中的任意公有属性  
  5、from pkg.module1 import submodule1
[python]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. module1 = __import__('pkg.module1', fromlist=['submodule1'])  
  2. module1.submodule1  
  3. #当fromlist不为空时,__import__方法会返回name参数中最右面的模块对象,此处是module1。  

一点感想

  

  第一次读webpy源码时看到了__all__属性,它被定义到模块的开头,很醒目。本以为只是与docstring类似的说明性文档,查询之后才发现这个属性还是很有用途的,它不仅在第一时间展现了模块的内容大纲,而且也更清晰的提供了外部访问接口。python对细节还是有要求的。

  相比于import关键字,__import__函数设计的更开放一些,比如 import pkg.module中pkg并没有被导入到命名空间,而__import__('pkg.module') 则导入了pkg。这种开放性是设计基本方法的根本原则,保持方法的通用性,更细粒度的需求则留给上层抽象去完成。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值