模块
一,模块的介绍
模块就是一些功能的集合。如何自己写一个模块创建一个py文件,给它起一个 符合变量名命名规则的名字,这个名字就是模块名。
二,导入模块的过程
- 找到这个模块
- 判断这个模块是否被导入过了
- 如果没有被导入过
- 创建一个属于这个模块的命名空间
- 执行这个模块中的代码
- 让模块的名字 指向 这个空间
三,给模块起别名
起别名之后可以简化一些代码量。
改进前:
1 def func(dic,t = 'json'): 2 if t == 'json': 3 import json 4 return json.dumps(dic) 5 elif t == 'pickle': 6 import pickle 7 return pickle.dumps(dic)
改进后:
1 def func(dic, t='json'): 2 if t == 'json': 3 import json as aaa 4 elif t == 'pickle': 5 import pickle as aaa 6 return aaa.dumps(dic)
四,导入多个模块
- 建议导入模块时,一行一行的导入。
-
规范建议 模块应该一个一个的导入 : 自定义模块,第三方模块,内置模块(已经是约定成俗的东西了。)
1 内置模块 2 扩展(第三方)模块 3 自定义模块 4 5 import os 6 7 import django 8 9 import my_module
五,from import
form import可以导入模块的个别功能,不用一下子都导入。
导入过程:
-
找到要被导入的模块
- 判断这个模块是否被导入过
- 如果这个模块没被导入过
-
创建一个属于这个模块的命名空间(如果已经导入的话直接跳过)
-
执行这个文件(如果已经导入的话,直接跳过)
-
找到你要导入的变量
-
给你要导入的变量创建一个引用,指向要导入的变量
导入多个模块的名字
from my_module import read1,read2 read1() read2()
给导入的起别名
1 from my_module import read1,read2 2 read1() 3 read2()
六,from my_module import *
此时,会导入模块所有的功能,并且名字也一块导入。
* 和 __all__ __all__能够约束*导入的变量的内容
__all__ ,会以列表的形式越是*的导入量。
七,模块的循环引用问题
尽量不要形成a引用b的同时b引用a,容易报错。
八,模块的加载与修改
如果导入一个模块后,导入的模块内容会引入你的内存之中。这样的话,如果这时候改变你的模块的话,不会改变到内存之中。
可以引用importlib模块,达到更新内存的效果。
1 import time,importlib 2 import aa 3 4 time.sleep(20) 5 # importlib.reload(aa) #更新内存。 6 aa.func1()
九,模块与脚本
脚本与模块区别:以py文件为例,当执行脚本时,可以直接打开实现一些功能。当py文件被其他文件引入时,则可以当成模块进行执行,并且引入时不会有任何东西被执行。
难点就在于怎么把一个py文件变成即可成脚本,又可变成模块。
此时在py文件加入全局变量__name__。
当做脚本运行:
__name__ 等于'__main__'
当做模块导入:
__name__= 模块名
作用:用来控制.py文件在不同的应用场景下执行不同的逻辑
if __name__ == '__main__':
1 def fib(n):
2 a, b = 0, 1
3 while b < n:
4 print(b, end=' ')
5 a, b = b, a+b
6 print()
7
8 if __name__ == "__main__":
9 print(__name__)
10 num = input('num :')
11 fib(int(num))
十,模块搜索路径
python解释器在启动时会自动加载一些模块,可以使用sys.modules查看
在第一次导入某个模块时(比如my_module),会先检查该模块是否已经被加载到内存中(当前执行文件的名称空间对应的内存),如果有则直接引用
如果没有,解释器则会查找同名的内建模块,如果还没有找到就从sys.path给出的目录列表中依次寻找my_module.py文件。
所以总结模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块
1 1 >>> import sys
2 2 >>> sys.path.append('/a/b/c/d')#如果新建的模块无法导入,可能是没有加到目录里,可以使用这个进行加入,这样就可以导入,不会报错了。
3 3 >>> sys.path.insert(0,'/x/y/z') #排在前的目录,优先被搜索
注意:搜索时按照sys.path中从左到右的顺序查找,位于前的优先被查找,sys.path中还可能包含.zip归档文件和.egg文件,python会把.zip归档文件当成一个目录去处理。
1 #首先制作归档文件:zip module.zip foo.py bar.py
2
3 import sys
4 sys.path.append('module.zip')
5 import foo,bar
6
7 #也可以使用zip中目录结构的具体位置
8 sys.path.append('module.zip/lib/python')
9
10 #windows下的路径不加r开头,会语法错误
11 sys.path.insert(0,r'C:\Users\Administrator\PycharmProjects\a')
至于.egg文件是由setuptools创建的包,这是按照第三方python库和扩展时使用的一种常见格式,.egg文件实际上只是添加了额外元数据(如版本号,依赖项等)的.zip文件。
需要强调的一点是:只能从.zip文件中导入.py,.pyc等文件。使用C编写的共享库和扩展块无法直接从.zip文件中加载(此时setuptools等打包系统有时能提供一种规避方法),且从.zip中加载文件不会创建.pyc或者.pyo文件,因此一定要事先创建他们,来避免加载模块是性能下降。
posted on 2023-12-05 02:36 我才是最帅的那个男人 阅读(39) 评论(0) 收藏 举报
浙公网安备 33010602011771号