GuangchaoSun's Blog

Python中导入模块的三种方法

今天做Python的练习时,用到了导入模块,一开始不会用,搜了几篇博客,顺便做一些记录。

方法一

1
import module_name

模块是指一个可以交互使用,或者从另一Python程序访问的代码段。只要导入了一个模块,就可以引用它的任何公共的函数、类或属性。模块可以通过这种方法来使用其它模块的功能。

用import语句导入模块,就在当前的名称空间(namespace)建立了一个到该模块的引用.这种引用必须使用全称,也就是说,当使用在被导入模块中定义的函数时,必须包含模块的名字。所以不能只使用 funcname,而应该使用 module_name.funcname

方法二

1
2
3
from module_name import funcname
from module_name import fa, fb, fc
from module_name import *

与方法一的区别:funcname 被直接导入到本地名字空间去了,所以它可以直接使用,而不需要加上模块名的限定

* 表示,该模块的所有公共对象(public objects)都被导入到当前的名称空间,也就是任何只要不是以”_”开始的东西都会被导入。

module_name没有被定义,所以module_name.funcname这种方式不起作用。并且,如果funcname如果已经被定义,它会被新版本(该导入模块中的版本)所替代。如果funcname被改成指向其他对象,module_name不能不会觉察到。

建议:

  • 如果你要经常访问模块的属性和方法,且不想一遍又一遍地敲入模块名,使用 from module import
  • 如果你想要有选择地导入某些属性和方法,而不想要其它的,使用 from module import
  • 如果模块包含的属性和方法与你的某个模块同名,你必须使用import module来避免名字冲突
  • 尽量少用 from module import * ,因为判定一个特殊的函数或属性是从哪来的有些困难,并且会造成调试和重构都更困难。

方法三

内建函数 __import__()
除了前面两种使用import关键字的方法以外,我们还可以使用内建函数 __import__() 来导入 module。两者的区别是,import 后面跟的必须是一个类型(type),而 __import__() 的参数是一个字符串,这个字符串可能来自配置文件,也可能是某个表达式计算结果。例如 mymodule = __import__ ('module_name')

附注:

  • 模块的内容都放在一个模块文件中,如 mymodule 的内容应该放在 PYTHONPATH 目录下的一个mymodule.py中,C实现的除外
  • 包可以将几个模块名称空间组织起来, 如A.b 就表示在包A中的一个子模块b 可以单独导入某一个子模块,如Python文档中给出的例子
1
import sound.effects.echo

这样必须使用全称对里面的对象进行引用,如
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
还可以使用下面的语句来加载echo子模块

1
from Sound.Effects import echo

它在没有包前缀的情况下也可以使用, 所以它可以如下方式调用:
echo.echofilter(input, output, delay=0.7, atten=4)不主张从一个包或模块中用import * 导入所有模块,因为这样的通常会导致可读性很差。
from Package import specific_submodule的用法并没有错,实际上这还是推荐的用法,除非导入的模块需要使用其它包中的同名子模块(the importing module needs to use submodules with the same name from different packages).

我还发现导入的模块会产生.pyc文件:
输入一个模块相对来说是一个比较费时的事情,所以Python做了一些技巧,以便使输入模块更加快一些。一种方法是创建 字节编译的文件 ,这些文件以.pyc作为扩展名。
在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行

参考

http://www.cnblogs.com/allenblogs/archive/2011/05/24/2055149.html