模块顶层下划线开头的变量
__name__: 当它的值为__main__时,表示它作为程序入口启动。
__all__:字符串数组的值,from * 就来自这里的字面量,那些__开头的不在这个数组中。
__future__:未来的一些扩展功能。from __future__ import featurename
as 扩展
import a.b.modulename as name
给modulename取一个别名,方便以后的使用,路径,名称有发生修改时,这个文件也方便修改。
用名称字符串导入模块
import from 中的模块名是硬编码的变量名,不能使用可计算的变量名
#错的
x = "string"
import x
方试一
>>> modname = 'string'
>>> exec('import ' + modname)
>>> string
<module 'string' from 'C:\\Python33\\lib\\string.py'>
方式二
用内置的__import__方法,返回模块对象
>>> modname = 'string'
>>> string = __import__(modname)
>>> string
<module 'string' from 'C:\\Python33\\lib\\string.py'>
方式三
>>> import importlib
>>> modname = 'string'
>>> string = importlib.import_module(modname)
>>> string
<module 'string' from 'C:\\Python33\\lib\\string.py'>
模块陷阱
顶层代码中的语序很重要
func1()
def func1():
print("a")
以上错的
from复制名称,而不是链接
#nested1.py
X = 99
def printer(): print(X)
#nested2.py
from nested1 import X, printer
X = 88
printer()
这里的X仍然是99,X新拷贝的
% python nested2.py
99
reload 不能用于from导入
from module import X # X may not reflect any module reloads!
. . .
from imp import reload
reload(module) # Changes module, but not my names
X # Still references old object
以上的X没有被重新加载
正确的做法:
import module # Get module, not names
. . .
from imp import reload
reload(module) # Changes module in place
module.X # Get current X: reflects module reloads