在python 中导入模块是我们最常用的功能,基本每个.py 文件中都会有 import 或者是 from * import 语句,可是,这两种方法有什么不同,有该怎么用?今天就好好分析一下。
先上定义:
模块导入允许我们将一个个独立的程序功能分别实现然后组合成一个复杂的系统。
主要有以下作用:
代码重用:
我们知道一段代码需要用到两次的时候,我们就需要写一个函数了这是一个道理。
避免变量名冲突:
每个模块都将变量名封装进了自己包含的软件包,这可以避免变量名的冲突,除非使用精确导入。
import 语句
import 语句就是这样, 也可以在一行内导入多个模块:
import module1[, module[...moduleN]]
但是这样的代码可读性不如多行导入语句,而且在性能上和生成 Python 字节码时这两种做法没有什么不同,所以一般情况下,我们使用第一种格式。
import 工作方式:
其中,导入程序搜索的目录如下:
import 解释 ;
加湿器执行到 import 语句,如果早搜索路径中找到了指定的模块,就会加载它,该过程遵循 LEGB 作用域原则,如果在一个模块中顶层导入,那么它就是全局的,如果早函数中导入,那么它的作用域就是局部的,如果模块时被第一次导入,它将被加载并执行:
import as 语句
有时候你导入的模块或是模块属性名称已经在你的城中使用了,或者你不想使用导入的名字,可能时它太长不便输入什么的,总之你不喜欢它,这已经成为 Python 程序员的一个普遍要求,使用自己想要的名字替换模块的原始名字。一个普遍的解决方案就是把模块复制给一个变量。这样便于自己使用。
from-import 语句
你可以在你的模块中导入指定的模块属性,也就是指定名称导入到当前的作用域。
使用:
from-import 语句可以实现我们的目的,它的语法是:
from module import name1,[name2..[name3...]]
from *
当我们使用 from * 的时候,会取得模块顶层左右赋值的变量名的拷贝。
注意: 当我们使用这种方法时,就会出现变量名的重复问题,因为我们把另外一个模块中的所有变量导入进来。在命名的时候会出现命名冲突的情况。
导入只发生一次
一个模块只被加载一次,无论它被导入多少次。
如果你的模块导入了 sys 模块。而你要导入的其他的5个模块也导入了它,那么每次都加载 sys (或是其他模块)不是明治之举,加载只在导入时发生。
import 和 from 是赋值语句
像 def 一样,import 和 from 是可执行的语句,他们可以出现在 if 中,可以出现在函数中,执行这些语句的时候才会进行解析,也就是说,被导入的模块和变量名只有在对应的 import 或 from 语句执行后才可以使用。
import 将整个模块对象赋值给一个变量名
from 将一个或多个变量名赋值给另外一个模块中同名的对象,所以 from 容易污染命名空间。
为什么不建议使用 “from * import ”
在实战中, “from module import * ” 不是良好的编程风格,如果使用 from 导入变量,且那些变量碰巧和作用域中现有的变量名同名,那么变量就会悄悄覆盖掉,使用 import 语句时后就不会发生着中问题,因为我们是通过模块名才获取的变量名,像 module attr 不会和现有的作用域的 attr 冲突。
何时使用 from module import:
我们只在两种场合下建议使用这样的方法,一个场合是:目标模块中的属性非常多,杜甫键入模块名不方便,例如: Tkinter (Python/TK)和 Numpy (Numeric Python)模块,可能还有 socket 模块。
另外一个场合实在交互解释器下,因为这样可以减少输入次数。