1.定义:
模块:用来从逻辑上组织Python代码(变量,函数,类,逻辑:实现一个功能),本质就是.py结尾的python文件
(文件名为test.py 对应的模块为test)
包:用来从逻辑上组织模块,本质就是一个目录(必须带有一个.__init__.py 文件)
1 name = 'Ri' 2 3 def say_hello(name): 4 print("hello,", name) 5
1 import moudel_ri 2 3 print(moudel_ri.name) 4 print(moudel_ri.say_hello('yang')) 5 6 #Ri 7 #hello, yang 8 #None
2.导入方法:
import moudle_ri 导入一个模块
import moidle_ri,moudle1.ri 导入多个
from moudle_ri import * 导入一个模块所有方法。一般不这样使用,假如导入的模块里面有一个test方法,直接test()就可以调用
如果在之后有test方法,会覆盖掉模块里面的方法。(因为python解释器是逐行解释运行的)
from moudle_ri import m1,m2,m3 导入多个
from moudle_ri import logger as lo 可直接用lo调用
1 from moudel_ri import logger as lo 2 3 lo() 4 5 Reloaded modules: moudel_ri 6 #in the logger!
3.import本质(路径搜索和搜索路径):
导入模块的本质是把python在当前文件解释一遍
import test 想当于 test = ‘test.py' all code
from test import m 相当于 m = ’m code‘
import moudle_ri --------> moudle_ri.py ------->moudle_ri.py 的路径 -----> sys.path
1 import sys,os 2 print(sys.path) 3 x_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 4 sys.path.insert(0,x_path) 5 print(sys.path) 6 7 #['C:\day5\moudle_test', 'C:\day5', 8 # 'C:\day5\venv\Scripts\python35.zip', 9 # 'C:\Python\Python35\DLLs', 'C:\Python\Python35\lib', 10 # 'C:\Python\Python35', 'C:\day5\venv', 'C:\day5\venv\lib\site-packages', 11 # 'C:\day5\venv\lib\site-packages\setuptools-39.1.0-py3.5.egg', 'C:\day5\venv\lib\site-packages\pip-10.0.1-py3.5.egg'] 12 #['C:\day5', 'C:\day5\moudle_test', 'C:\day5', 'C:\day5\venv\Scripts\python35.zip', 13 # 'C:\Python\Python35\DLLs', 'C:\Python\Python35\lib', 'C:\Python\Python35', 'C:\day5\venv', 'C:\day5\venv\lib\site-packages'
导入包的本质是就是执行包下的.__init__.py 文件
4.导入优化
1 # import moudle_test 2 from moudle_test import test #因为这里有很多地方多需要使用模块下的test,所以用 from moudle_test import test 免去了重复导入的过程 3 4 5 def logger(): 6 #moudle_test.test() 7 test() 8 print("in the logger") 9 10 def search(): 11 #moudle_test.test() 12 test() 13 print("in thr search") 14 15 16 logger() 17 search() 18 19 # 假设有两个目录day5,day4.需要在day5里的一个py文件导入day4里面的包里的模块 20 #import sys,os 21 #x = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 第一个dirname 到达day5,第二个到达day5的上级目录 22 #sys.path.append(x) 23 #from day4 import package_test 24 #package_test.test1.test()
5.模块的分类:
第一类:标准库(自带)
第二类:开源模块(第三方库)
第三类:自定义模块