----
====== 模块 ======
----
* 一个模块就是一个文件
* 模块有自己的命名空间
* 模块只会被import一次(再次倒入要用reload函数,常用于修改配置文件)
* 查看模块内容 dir(mod_name)
* 模块查找路径print sys.path
* 要使用某个模块时必须import一次,
* 假如a.py要使用time模块,必须执行import time。即使包含a.py的main.py已经import time了。每次import只会在当前文件生效,不会传递
* 但是python解释器会做一次优化,python只执行一次time模块,然后只是把time模块的“使用权”分给其他文件罢了
====== import流程 ======
- 找到模块位置
- 编译成位码(需要时)
- 执行模块中的代码来创建其所定义的对象
----
====== 模块只能访问自己的变量 ======
mod1.py
v1='from mod1'
def f1():
global v1
print v1
main.py
import mod1
v1='from main'
mod1.v1()
结果:
from mod1
----
====== import 和 impor..from ======
**import**
v1='from main'
import mod1
print v1
print mod1.v1
结果:
from main
from mod1
import 会把模块以对象的形式引用到当前作用域
**form**
v1='hello'
from mod1 import v1
print v1
结果:
from mod1 #import的v1覆盖了当前的v1
把变量名复制到当前作用域(容易引起命名冲突,不建议使用)
----
====== import 非当前目录下的模块 ======
假如我要import mod2/mod2.py
from mod2 import mod2 #多层目录用 . 链接
print mod2.v2
mod2目录下一定要有一个__init__.py文件(用于标识这个目录是python模块目录,内容可为空),否则无法引入mod2目录下的模块。python首次倒入某个目录时,会自动执行目录下的__init__.py文件,所以__init__.py文件一般用于初始化。
----
====== 模块属性 ======
一个文件(模块)有若干内置属性,这些属性描述了模块的特征。
* __name__
* 模块的名字
* 如果是以顶层文件执行,则自动复制为“__main__”
* __all__
* help(mod_name)的时候会展示__all__中的内容
----
====== 模块高级功能 ======
* import string as a(为模块取别名)
* 动态修改python搜索模块的路径,修改sys.path属性即可
* 导入模块(模块是一个变量)
mod_name="string"
exec("import", mod_name)