模块
1.定义
用来从逻辑上组织python代码(实现一个功能),本质就是.py结尾的python文件
模块名就是这个文件名
包:本质就是一个目录(必须带有一个__init__.py文件),用来从逻辑上组织模块
包内的文件需要导入到__init__.py中,这样在导入包时才有用, __init__.py的编写原则,如何编写__init__.py文件?
__init__.py的编写
编写Python代码(不建议在__init__中写python模块,可以在包中在创建另外的模块来写,尽量保证__init__.py简单)
模块中不使用__all__属性,则导入模块内的所有公有属性,方法和类 。 模块中使用__all__属性,则表示只导入__all__中指定的属性,
因此,使用__all__可以隐藏不想被import的默认值。 __all__变量是一个由string元素组成的list变量。
它定义了当我们使用 from <module> import * 导入某个模块的时候能导出的符号(这里代表变量,函数,类等)。
from <module> import * 默认的行为是从给定的命名空间导出所有的符号(当然下划线开头的变量,方法和类除外)。
需要注意的是 __all__ 只影响到了 from <module> import * 这种导入方式, 对于 from <module> import <member> 导入方式并没有影响,
仍然可以从外部导入。
当一个目录内有了__init__.py文件后python解释器就会把这个目录认作一个包,我们就可以导入其中的模块了
module_name.m1.test()
2.导入方法
import module_name1, module_name2, ...
from module_name import * : 这种导入方式是直接把目标模块代码拿过来然后再解释,不建议使用
导入的模块中如果有名字与当前模块有重复,则会覆盖当前名称
from module_name import logger as logger_mfkcel: 从目标模块导入指定的代码块并另取名为logger_mfkcel
3.import本质(路径搜索与搜索路径)
import module_name:
它的本质是将目标模块解释后再把解释的结果赋值给module_name
import module_name ---> module_name.py ---> module_name.py的路径 --> sys.path
根据 sys.path给出的路径集 去搜索这个.py文件
如果没有搜索到,就会导入失败,解决方法应该在sys.path加入一个需要导入模块的目录的路径 sys.path.append()
导入一个包的本质,就是执行该包下的__init__.py文件
4.导入优化
当要多次使用一个模块内的代码时,使用 from module_name import ? as ?这样就可以只导入一次,后面在使用时,就直接
使用了,不用再导入了
5.模块的分类
a.内置库,标准库
b.开源库
c.自定义模块