模块

一,模块的介绍

  模块就是一些功能的集合。如何自己写一个模块创建一个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)    收藏  举报

导航