python模块的定义、导入和优化
- 模块的定义:本质是一个python文件。从逻辑上组织代码(变量,函数,类,逻辑等)去实现一个功能。
- 包的定义:本质上就是一个目录(包含了一个_init_.py文件)。从逻辑上组织模块。
- 模块的导入:
import module1,module2,module3……
from module1 import *
from module1 import prt as print_m1
#注意:直接使用import module1的时候,调用module1里的prt方法应该使用如下写法:
module1.prt()
#如果使用from module1 import *的时候应该这样写(如果不想导入全部方法只想导入部分,可以把*换成相应的方法名)
prt()
#这里可以看出,from的格式是将module1里的代码拷贝出来,复制到当前位置并执行,因此不需要加前缀。
#如果当前文件中有定义了一个和导入模块中同名的方法,而运行的时候又不想覆盖,则可以使用如下写法:
from module1 import prt as print_m1
#注意:此时导入模块中的方法运行的时候不再是prt(),而是print_m1()。
- import的本质:
- 导入模块的本质是把python文件解释一遍
1、import module1 相当于 module1=all_code (module1里的所有代码)
#因此使用import方法时,调用模块里的方法应该是:module1.prt()
2、from module1 import prt 相当于把prt()这个方法的代码拷贝到当前文件里
#因此调用方法时可以直接prt()
- 导入包的本质是执行包下面的_init_.py文件
- 导入同级目录下的模块或包
目录如下:
conf里的__init__.py文件:
# encoding: utf-8
'''
# @Author : ccq
# @File : __init__.py.py
# @Time : 2019/6/16 11:37
'''
from . import settings # 相对路径导入写法(.表示相对路径)
#from . import settings 这样的写法是用来导入同级目录下的文件的。
settings文件:
# encoding: utf-8
'''
# @Author : ccq
# @File : settings.py
# @Time : 2019/6/16 11:37
'''
def testfunc():
print("this is settings")
imp文件:
# encoding: utf-8
'''
# @Author : ccq
# @File : imp.py
# @Time : 2019/6/20 20:14
'''
import conf
conf.settings.testfunc()
- 导入不在同一目录下的模块或包
导入模块和包时可以通过print(sys.path)来查看当前目录,如果当前目录下没有要导入的文件,就会报错。
通过 print(os.path.abspath(__file__)) 这段代码,可以看到当前文件的路径。
通过os.path.dirname(os.path.abspath(__file__))代码,查询当前文件的父目录路径。
#os.path.dirname()是查询查询当前文件的父目录路径,os.path.abspath(__file__)是当前文件的路径。二者缺一不可。
通过以上方式,不断向上返回,来找到正确的路径。然后通过sys.path.append()方法添加路径。
#当然,append是加到末尾,如果要想放在前面的话,就用insert
#下面是一个小例子:
# encoding: utf-8
'''
# @Author : ccq
# @File : atm.py.py
# @Time : 2019/6/16 11:36
'''
# 启动文件
import os, sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
from conf import settings
from core import main
main.prt()
#结构图如下:
- 导入优化:
#当一个py文件中重复出现另外模块里的方法调用时,例如:
# encoding: utf-8
'''
# @Author : ccq
# @File : imp.py
# @Time : 2019/6/20 20:14
'''
import module_test
def function1():
module_test.testfunc()
def function2():
module_test.testfunc()
def function3():
module_test.testfunc()
def function4():
module_test.testfunc()
def function5():
module_test.testfunc()
#conf.settings.testfunc()这段代码重复了很多次。这段代码的意思是到conf包下的settings文件里去调用testfunc()方法,如果每一次都去找,将产生大量不必要的消耗。这时可以采用如下方法:
# encoding: utf-8
'''
# @Author : ccq
# @File : imp.py
# @Time : 2019/6/20 20:14
'''
from module_test import testfunc
def function1():
testfunc()
def function2():
testfunc()
def function3():
testfunc()
def function4():
testfunc()
def function5():
testfunc()
function1()
#这样可以减少消耗,来达到优化的效果
- 模块的分类:
模块分为三大类:
- 标准库
- 开源模块
- 自定义模块