1.定义

模块:用来从逻辑上组织python代码(变量,函数,类,逻辑)实现一个功能。

本质上就是.py结尾的Python文件。

比方说:文件名:test.py   ,对应的模块名为:test

 

:用来从逻辑上组织模块的,本质上就是一个目录(必须带有一个叫__init__.py的文件)

2.导入方法

方法1:

导入一个模块:import module_name

导入多个模块:import module_name,module_name2

这种方法导入后要用模块中的方法:module_name.func()

方法2:

导入一个模块中所有的功能   from module_name import *  

不建议这样使用,因为这样导入的方式是将module_name中的所有代码都导入到当前环境中。在当前环境中想要调用module_name中的方法直接调用即可。不能在方法中加上module_name,如果加上运行这会报错返回"module_name"未定义。

如果在module_name中的某一个函数和当前环境定义的函数相同,这会输出当前环境定义的函数,覆盖原来module_name中的同名方法。这样会产生冲突情况。

 

导入一个模块中的指定功能(一个即以上)  from module_name import logger,func,func2

如果当前环境中也有一个logger方法,还是会和上面的方法一样,也会被当前环境下定义的新的logger方法覆盖。

优化方法:from module_name import logger as lg

给方法取别名,这样就能避免重名的方法。

 

3.import本质(路径搜索和搜索路径)

 导入模块的本质就是把.py文件解释一遍。

import module_name----->module_name.py-------路径搜索---------->找到module_name.py的路径------->sys.path

  import module_name 就是把module_name解释一遍,等价于module_name=module_name.py文件中的所有代码解释后的所有内容。

  from module_name import func1 就是到module_name中找到func1,将func1解释了一遍,所以用这种方法导入后,想要调用func1直接调用即可,前面不用加上前缀。

 

导入包的本质就是执行该包下的__init__.py文件。

 

import的本质都是在路径中搜索指定的包或模块,默认会在当前路径中有限查找,如果要导入的包或模块不在当前路径中,会在PYTHONPATH环境变量的中的路径中查找。

import sys,os
print(sys.path)   #返回pythonpath环境变量的路径组成的列表。

如果在pythonpath环境变量中都未能找到指定的包或模块,则会报错。

为了确保导入,可以将要导入的包或模块的路径添加到sys.path中。

import sys,os
os.path.abspath(__file__)    #返回当前文件的path规范化的绝对路径
file_path=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))   #os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素。
sys.path.append(file_path)   #在pythonpath的列表的最后加上指定的路径。
sys.path.insert(0,file_path)  #在pythonpath的列表的指定位置(0为首位)上添加file_path

在PYTHONPATH环境变量中添加了指定的路径后,就能成功导入包或模块。

 

导入包以后调用包内的模块及函数。

有一个包名为package_test,下面有一个test1.py文件,一个__init__.py文件。

在import_package.py文件中导入package_test:

import package_test   #本质上是run __init__.py--->test1=‘test1.py all code'

package_test.test1.name()  #想要能够成功运行包下面模块test1中的函数name()

在__init__.py文件中输入“from . import test1”(从当前目录下导入test.py)  #本质上是test1=‘test1.py all code'。

test.py文件中有个函数为name()。

基于以上的条件“package_test.test1.name()” 能够成功执行。

 

4.导入优化

如果导入中重复地从模块中找到指定的对象。module_name.func()这种找法,每次调用module_name中的方法都需要不停地从module_name中找,会影响效率。

优化方法:from module_name import func (as alias)

  调用时可以直接调用,不需要再func前面加上module_name.,就不再需要不断地重复到module_name中查找的过程。

 

5.模块的分类:

分为3大类:

  1.标准库。

  python解释器自带的模块。如:time&datetime, random, os, sys, shutil, json&pickle, shelve, xml处理, yaml处理, configparser, hashlib, subprocess, logging模块, re正则表达式

  2.开源模块。

  3.自定义模块。

posted on 2017-06-29 17:18  Zoe233  阅读(285)  评论(0编辑  收藏  举报