【Python】Python 三种导入模块的方法和区别
2015-12-05 18:03
696 查看
方法一
[python]
view plaincopy
import modname
模块是指一个可以交互使用,或者从另一Python 程序访问的代码段。只要导入了一个模块,就可以引用它的任何公共的函数、类或属性。模块可以通过这种方法来使用其它模块的功能。
用import语句导入模块,就在当前的名称空间(namespace)建立了一个到该模块的引用.这种引用必须使用全称,也就是说,当使用在被导入模块中定义的函数时,必须包含模块的名字。所以不能只使用 funcname,而应该使用 modname.funcname
方法二
[python]
view plaincopy
from modname import funcname
from modname import fa, fb, fc
或者
[python]
view plaincopy
from modname import *
单行导入
modname没有被定义,所以modname.funcname这种方式不起作用。并且,如果funcname如果已经被定义,它会被新版本(该导入模块中的版本)所替代。如果funcname被改成指向其他对象,modname不能不会觉察到。
建议:
1)如果你要经常访问模块的属性和方法,且不想一遍又一遍地敲入模块名,使用 from module import
2)如果你想要有选择地导入某些属性和方法,而不想要其它的,使用 from module import
3)如果模块包含的属性和方法与你的某个模块同名,你必须使用import module来避免名字冲突
4)尽量少用 from module import * ,因为判定一个特殊的函数或属性是从哪来的有些困难,并且会造成调试和重构都更困难。
方法三
内建函数__import__()
除了前面两种使用import关键字的方法以外,我们还可以使用内建函数 __import__() 来导入 module。两者的区别是,import 后面跟的必须是一个类型(type),而__import__() 的参数是一个字符串,这个字符串可能来自配置文件,也可能是某个表达式计算结果。例如:
[python]
view plaincopy
mymodule = __import__ (’module_name’)
附注:
1)模块的内容都放在一个模块文件中,如 mymodule 的内容应该放在PYTHONPATH 目录下的一个mymodule.py中,C实现的除外
2)包可以将几个模块名称空间组织起来, 如A.b 就表示在包A中的一个子模块b
可以单独导入某一个子模块,如Python文档中给出的例子
[python]
view plaincopy
import sound.effects.echo
这样必须使用全称对里面的对象进行引用,如
[python]
view plaincopy
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
还可以使用下面的语句来加载echo子模块
[python]
view plaincopy
from Sound.Effects import echo
它在没有包前缀的情况下也可以使用, 所以它可以如下方式调用:
[python]
view plaincopy
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).
综上所述,一般情况应该使用import , 但有几个例外
1)module文档告诉你要用from-import的
2)导入一个包组件。需要一个包里面的某个子模块,一般用from A.b import c比import A.b.c 更方便 且不会冒混淆的危险.
reload方法
>>> from imp import reload >>> reload(script1)reload函数载入并运行了文件最新版本的代码,如果已经在另一个窗口中修改并保存了它,那将反映出修改变化。 reload函数希望获得的参数是一个已经加载了的模块对象的名称,所以如果在重载之前,请确保已经成功地导入了 这个模块。值得注意的是,reload函数在模块对象的名称前还需要括号,import则不需要。reload是一个被调用的 函数,而import是一个语句。
注意:python3.0把reload内置函数移到了imp标准库模块中。它仍然像以前一样重载文件,但是,必须导入它才能 使用。
在python3.x中的相对导入
首先定义一个包:
sound/
__init__.py
formats/
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/
__init__.py
echo.py
surround.py
reverse.py
...
filters/
__init__.py
equalizer.py
ocoder.py
karaoke.py
...
当一个包被组织成子包,可以使用绝对路径来引用子包中的模块。例如:sound.filters.vocoder模块要想使用sound.effects子包中的echo模块,可以使用from sound.effects import echo。
也可以使用相对路径来导入,方式为from module import name.可以使用一个点.来表示当前包,用两个点..表示父包。例如在surround模块中可以调用如下:
from . import echo
from .. import formats
from ..filters import equalizer
注意,相对路径导入都是基于当前模块的名字。因为主模块的名字总是"__main__",如果一个模块想要成为一个应用程序的主模块,那么模块中的引用一定要使用绝对路径导入。
解决导入循环问题
有下面两个模块,a.py和b.py
a.py
b.py
相关文章推荐
- Python爬虫入门七之正则表达式
- python基础教程共60课-第7课if
- Python爬虫入门六之Cookie的使用
- python 函数式编程 高阶函数 装饰器
- python--更干净的词频统计
- 《利用python进行数据分析》读书笔记--第六章 数据加载、存储与文件格式
- python基本 迭代
- python基础教程共60课-第6课bool
- Python爬虫入门五之URLError异常处理
- python int to binary and count the number of 1
- Python爬虫入门四之Urllib库的高级用法
- python编码检测模块chardet
- Python爬虫入门三之Urllib库的基本使用
- Python爬虫入门二之爬虫基础了解
- Python爬虫入门一之综述
- [转]逻辑斯蒂回归 via python
- Python 爬虫学习系列教程----目录
- python--10行代码搞定词频统计
- python基础教程共60课-第5课变量
- python基础教程共60课-第4课输入