跳转至

14. 模块

模块 Moudle

    什么是模块
        模块是一个包含一系列数据,函数,类等组成的程序组
        模块是一个文件,模块文件名通常以.py结尾

    作用
        让一些相关的数据,函数,类等有逻辑的组织在一起,使逻辑结构更加清晰
        模块中的数据,函数和类等可以提供给其他模块或程序使用

    模块的分类
        1. 内置模块,在解释执行器内部定义,可以直接使用
        2. 标准库模块,安装python时已经安装且可以直接使用
        3. 第三方模块(通常为开源), 需要自己安装
        4. 用户自定义模块(可以作为其他人的第三方模块)

import 语句

    语法
        import 模块名1[as 模块新名1], 模块名2[as 模块新名2]...
    作用
        将某模块整体导入到当前模块中
    示例
        import math  # 导入数据模块
        import sys, time  # 导入系统模块和时间模块
    用法
        模块名.属性名
        如
            math.factorial(5)
            math.cos(0)

from import 语句

    语法
        from 模块名 import *
    作用
        将某模块的所有属性全部导入到当前模块
    示例
        from math import *
        print(sin(pi / 2))
        print(factorial(5))  # 可以直接使用math里的全部属性

dir 函数

dir([对象])   返回一个字符串列表
    作用
        1. 如果没有参数调用,则返回当前作用域内所有变量的列表
        2. 如果给定一个对象作为参数,则返回这个对象的所有变量的列表
            (1)对于一个模块,返回这个模块的全部属性
            (2)对于一个类对象,返回类对象的所有变量并递归基类对象的所有变量
            (3)对于其他对象返回所有变量,类变量和基类变量

用户自定义模块

    要求:
        模块名以'.py'结尾
        模块名必须是标识符的命名规则,避免名称和内建模块冲突
    导入方式
        import 语句
        from import 语句
        from import * 语句

import 语句的搜索路径

  1. 索引内建模块 bulitin
  2. 搜索程序的运行时路径(当前路径)
  3. sys.path提供的路径

两种方法让用户自定义模块被导入

  1. 将模块复制到sys.path提供的路径
  2. 在运行时,在sys.path里添加自定义的路径

模块的加载过程

​ 在模块导入时,模块的所有语句都会执行,如果一个模块已经被导入,则再次导入时不会重新执行模块内的语句

模块的重新加载

    import mymod
    import imp
    import reload(mymod)

模块被导入和执行的过程

    1. 先搜索相关路径找模块文件(.py)
    2. 判断是否有此模块对应的.pyc, 如果有pyc文件存在且比.pyc新则直接加载.pyc文件
    3. 否则用模块名.py 文件生成.pyc 并加载执行

模块的编译

         编译                                      解释执行
       mymod.py       --->mymod.pyc      ------>   python3

模块的属性

    模块的文档字符串
        模块内的第一次没有赋值给任何变量的字符串为模块的文档字符串
        模块内的文档字符串绑定在模块的__doc__属性上

    __doc__属性 用来绑定文档字符串

    __file__属性
        用于绑定此模块对应的文件路径

    __name__属性
        1. 用来记录模块自身的名字
        2. 用来判断是否为主模块
            (注:主模块是指程序最先被python3 执行的模块)
        说明
            当此模块为主模块运行时,__name__的值为__main__
            当此模块不是主模块时,__name__绑定模块的名字

    __all__列表
        模块中的__all__列表必须是一个字符串列表
        作用
            当用from mymod import * 导入时,只导入__all__列表内属性
# 此列表限定当用from mymod2 import * 时只导入 f1 和 var1
__all__ = ['f1', 'var1']
def f1():
    pass


def f2():
    pass


def f3():
    pass

var1 = 100
var2 = 200

模块的隐藏属性

模块中以下划线'_' 开头的属性,在from xxx import * 导入时将不被导入, 通常称为这些属性为隐藏属性