一系列功能的集合体,在python中一个py文件就是一个模块,模块名就是py文件的文件名;
模块的好处:
1.减少重复的代码
2.拿来主义
定义模块:
就是创建一个py文件;
使用模块:
关键字:import
用法:import 模块名(不要加py后缀)
注意区分执行文件和模块文件,执行文件是你当前逻辑程序,模块文件是你用来调用功能的文件;
首次导入模块:
1.创建一个模块的名称空间
2.执行模块文件,将模块文件产生的名字存放于创建的模块名称空间
3.当执行文件中拿到一个模块名,该模块名指向模块名称空间中的模块名
强调:当第一次导入模块名,就会把模块内容导入到内存空间,在同一文件再次导用模块名时调用的就是第一次导入内存空间内的模块文件,不会从新导入模块文件;
调用模块内的功能:
用模块名.功能名()
注意:
模块中功能的执行始终以模块自己的名称空间为准;
也就是调用的模块功能用的都是该模块内的值,修改的也是该模块内的值,并不影响当前执行文件;
为模块起别名:
关键字as
定义:
import 模块名 as 想定义的模块名;
用处:
1.模块名太长,把模块名定义短一点,减少繁琐
2.比如有两个模块,两个模块有相同的功能名,但其中的功能效果不同,这时候就可以把两个模块名都改成相同的模块名,
用一个输入加判断,来确定你要导入的是哪个功能,你输入的是哪个模块名,就是哪个模块内功能的效果,模块名(修改过)和功能名未变,
,使用的是什么功能取决于你输入的模块名,其他的代码都无需改动,以后修改只需要,多添加一个判断模块名就可以了;
导入多个模块(不推荐)
import 模块名1,模块名2,模块名3
推荐还是多行导入
第二种导入方式:
关键字 from
from 模块名 import 功能名1,功能名2,功能名3
首次导入:
1.创建一个模块的名称空间
2.执行模块文件,将模块文件产生的名字存放于创建的模块名称空间
3.在当前名称空间中可以直接拿到模块中的名字,可以直接使用,不用加任何前缀
注意:这种情况,因为没有模块名.功能名,如果在当前执行文件中有与模块名内功能相同的名字,就会执行当前文件内的功能名(变量名),
所以要注意,不能取与模块功能相同的名称;
多个调用:
关键字:*
from 模块名 import *
*代替所有能调用的功能的名字;
注意:因为有些功能常用,有些功能不常用,模块的设计者,一般都会控制*所能调用的模块名;
关键字:__all__=[]
__all__=[功能名1,功能名2....]
限制以后,*所能调用的就只能是all以内的功能名;
测试模块功能:
关键字:__name__
__name__的值
1.在文件被直接执行的情况下等于__main__
2.在文件被导入的情况下等于模块名
也就是可以用__name__来判断,是否是直接执行测试功能,还是导入
if __name__ == '__main__':#代码块
print('再代码块中输入你所要测试的功能')
模块的搜索路径
sys.path:当前执行文件所在的文件夹;只看第一个路径;
可以用print(sys.path)在终端输出路径,第一个就是当前执行文件所在的文件夹
模块的查找顺序:
1.内存空间
2.内置空间
3.sys.path路径
sys.modules:当前内存中已经被导入的模块
print(sys.modules) :在终端输出内存中所有被导入的模块
在sys.path中添加路径
sys.path.append(需要添加的路径)
比如你把模块文件放在了别的文件夹,sys.path只是当前文件夹,这时候用append把放模块的文件夹的路径加到sys.path中,
这样就能在sys.path找到模块所在的文件夹,就可以调用模块
软件开发目录规范
路径:用常量名,后面赋予路径
常量路径名=r'路径'
常用目录:(当前水平用这个目录足够了)
ATM:文件夹,所需要做的项目名,用于存放项目相关所有文件和文件夹
readme:文件,用于介绍程序功能
bin:文件夹,只放启动文件
start:文件,启动文件
conf:文件夹,用于存放配置文件
settings:文件名,配置文件
core:文件夹,存放核心逻辑
src:文件名,业务核心逻辑文件
db:文件夹,用于存放数据文件
db:文件名,用于存放数据
lib:文件夹,用于存放常用工具,也就是模块文件
common:文件名,常用功能文件,也就是常用模块文件
log:文件夹,用于存放文件日志
access.log:文件名,日志文件
应该把项目的根目录添加到环境变量中;
就比如上方的ATM项目:
根目录就是ATM目录,以后需要调用什么功能,在根目录下都可以查找到
取目录:
os.path.dirname(__file__) :取当前文件所在的目录
os.path.dirname(os.path.dirname(__file__) ) :取当前所在在文件目录的上一级目录
以此类推,取第几层就写几段,后面有跟方便的方法,此方法仅供参考
然后把你需要的路径,赋值到一个常量当中,当以后有需要调用的时候,直接调用常量名
不必输入固定目录,以限制程序
比如,sys.path.append(os.path.dirname(__file__) ):直接加入当前路径
第二种方法:推荐
os.path.normpath(os.path.join(
__file__,
'..',
'..'
))
logging模块
debug:代表调试信息,级别10
info:代表正常运行信息,级别20
warning:代表警告信息,级别30
errot:代表错误信息,级别40
critical:代表崩溃信息,级别50
设置成什么级别,打印什么级别信息