__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
- __import__('pkg')
2、import pkg.module1
- pkg = __import__('pkg.module1',fromlist=[])
- pkg.module1
- #__import__会导入所有以'.'分割的模块,比如本例中pkg和module1都会被导入 。但是当fromlist为[]时,__import__只会最左边的模块作为返回值,此处是pkg。
- pkg = __import__('pkg',fromlist=['module1','module2'])
- module1 = pkg.module1
- module2 = pkg.module2
4、from module1 import func1,func2
- module1 = __import__('module1',fromlist=['func1','func2'])
- func1 = module1.func1
- func2 = module1.func2
- #可以调用module1中的任意公有属性
- module1 = __import__('pkg.module1', fromlist=['submodule1'])
- module1.submodule1
- #当fromlist不为空时,__import__方法会返回name参数中最右面的模块对象,此处是module1。
一点感想
第一次读webpy源码时看到了__all__属性,它被定义到模块的开头,很醒目。本以为只是与docstring类似的说明性文档,查询之后才发现这个属性还是很有用途的,它不仅在第一时间展现了模块的内容大纲,而且也更清晰的提供了外部访问接口。python对细节还是有要求的。
相比于import关键字,__import__函数设计的更开放一些,比如 import pkg.module中pkg并没有被导入到命名空间,而__import__('pkg.module') 则导入了pkg。这种开放性是设计基本方法的根本原则,保持方法的通用性,更细粒度的需求则留给上层抽象去完成。