python 模块和包
一. 模块的概念
1. 模块的分类
内置模块 : 安装python解释器的时候跟着装上的那些方法
第三方模块/扩展模块 : 没在安装python解释器的时候安装的那些功能
自定义模块 : 你写的功能如果是一个通用的功能,那你就把它当做一个模块
2. 什么是模块
有的功能开发者无法自己实现, 这样需要借助已经是实现的函数/类来完成这些功能. 别人写好的这些功能被放在文件夹/py文件/C语言编译好的编译文件, 被称为模块. 模块的好处: 节省内存,提供更多的功能.
二. 模块的创建和导入
一个模块不能被导入多次, 执行模块导入语句, 会先给模块开辟一块空间, 然后执行模块的语句,最后在本程序空间生成一个引用指向模块.
# 导入单个模块 # import 模块名 # 模块名和变量名命名规则一样 # from 模块名 import 变量名 # 只能使用模块里导入的变量名(变量或方法),没有导入的无法使用,没有导入但是在模块内存中有,但本程序没有指向模块变量的引用 # 导入多个模块 # import 模块1, 模块2, 模块3, ... # 不建议使用 # import ,模块1 # import ,模块2 # import ,模块3 # ...... # 模块导入规范PEP8规范 # 所有的模块导入都应该尽量放在这个文件的开头 # 模块的导入也是有顺序的 # 先导入内置模块 # 再导入第三方模块 # 最后导入自定义模块
模块中导入的方法或者变量和本文件重名的时候,那么这个名字只代表最后一次对它赋值的哪个方法或者变量,在本文件中对全局变量的修改是完全不会影响到模块中的变量引用的.
# 重命名 # import 模块名 as new_name # 改名后只能通过new_name对模块进行操作 # from 模块名 import 变量名 as new_name # 改名后只能通过new_name对变量进行操作
# from 模块 import * 导入模块所有的变量 # __all__= [] 可以控制*导入的内容
三. pyc编译文件和重新加载模块
import aaa # 模块导入的时候 # python的执行 # 解释 - 编译 # 当一个文件作为一个脚本被导入的时候 # 就会在这个文件所在的目录的__pycache__下生成一个编译好的文件 # 为了之后导入这个文件的时候直接读这个编译好的pyc文件就可以 # 可以节省一些导入时候的时间
四. 模块的使用
1. 模块当成脚本运行
# 运行一个py文件的两种方式 # 1.以模块的形式运行 # import my_module # if __name__ == '__main__': # my_module.login() # 2.直接pycharm运行 cmd运行 # ----以脚本的形式运行 # 那么需要在本文件中直接打印的代码上加上 # if __name__ == '__main__':
# 在编写py文件的时候 # 所有不在函数和类中封装的内容都应该写在 # if __name__ == '__main__':下面 # import sys # import my_module # sys.modules # {'sys':文件的内存地址, # 'my_module': my_module的地址 # '__main__':当前直接执行文件所在的地址} # 存储了所有导入的文件的名字和这个文件的内存地址 # 再使用反射自己模块中的内容的时候 # import sys # getattr(sys.modules[__name__],变量名)
2. 模块搜索路径
#首先制作归档文件:zip module.zip foo.py bar.py import sys sys.path.append('module.zip') import foo,bar #也可以使用zip中目录结构的具体位置 sys.path.append('module.zip/lib/python') #windows下的路径不加r开头,会语法错误 sys.path.insert(0,r'C:\Users\Administrator\PycharmProjects\a')
3. 重新加载模块
import aaa import time import importlib aaa.login() time.sleep(20) # 停止程序20秒 importlib.reload(aaa) # 表示重新加载 aaa.login() # 在import之后 再修改这个被导入的模块 # 程序感知不到 # reload这种方式可以强制程序再重新导入这个模块一次 # 非常不推荐使用
4. 模块的循环引用
# 在模块的导入中 不要产生循环引用问题 # 如果发生循环导入了 # 就会发现明明写在这个模块中的方法,确偏显示找不到
五. 包
包是一种通过使用‘.模块名’来组织python模块名称空间的方式。
1. 包的导入
# import 包.包.包.模块 # 凡是在导入时带点的,点的左边都必须是一个包 # from 包.包.包 import 模块名
2. __init__.py文件
导入包 相当于执行了这个包下面的__init__.py, 设计一下__init__.py文件来完成一些模块的导入
3. 绝对导入和相对导入
绝对导入:以最外层的包作为起始
相对导入:用.或者..的方式最为起始(只能在一个包中使用,不能用于不同目录内)
注意:可以用import导入内置或者第三方模块(已经在sys.path中),但是要绝对避免使用import来导入自定义包的子模块(没有在sys.path中),应该使用from... import ...的绝对或者相对导入,且包的相对导入只能用from的形式。
无限的我,现在才开始绽放,从东边的第一缕阳光到西边的尽头