模块

  • 包含函数、类或其他语句的Python脚本,通俗理解一个.py文件就是Python中的一个模块。
  • 作用:模块是用来管理具体的功能代码的,比如说模块里面可以定义(全局变量,类,函数等功能代码),模块好比是一个工具箱;复杂程序功能分类细化,不同功能放在不同脚本,便于维护和重用。
  • 命名:模块和变量名的组成一样,都是由字母、数字、下划线组成,但是不能以数字开头如果模块名以数字开头了,那么这个模块不能被其它模块导入使用
  • 模块名的命名方式和变量名的命名方式一样,使用下划线命名法
  • (其实可以用其他字符命名,但和数字开头一样,不能被其他模块导入使用)

导入模块

1、import 模块名字 或 import 模块名字 as 别名

  • 当导入多个模块的时候
# 推荐
import 模块名1
import 模块名2
......

# 可以,但不建议以下形式(不符合PEP8规范)
import 模块名1, 模块名2, ......

# 导入模块后的使用
模块名.模块中的方法()
模块名.模块中的变量
模块名.模块中的类
...

模块别名

  • 如果模块名过长,可以使用as给模块起个别名。
# 起别名
import 模块名字 as 别名
# 使用
别名.模块中的方法/变量/类等

2、from 模块名字 import 函数/类名

  • 只导入模块中的指定函数/类名,导入多个时以’,'隔开。这样只能使用模块中指定的功能,不导入的不能用。
# 导入格式
from 模块名 import 指定的功能1, 指定的功能2, ...
# 使用
指定的功能.指定功能的方法

from 模块名字 import *

  • 默认导入指定模块里面的所有功能代码,如果不想别人导入自己模块里的所有功能,可以使用__all__
  • 这样,外界导入该模块使用 from 模块名 import * 的时候不是导入模块的里面的所有功能代码,而是__all__里面指定的功能代码。
# 模块中的all规定了其他模块导入自己使用import * 时,可用的功能
__all__ = ["Teacher", "sum_num"]  # 例表中存放的时函数名、变量名、类名等

模块重载

  1. 自己创建的模块名不能和系统的模块名字一样,这样会优先使用你自己创建的这个模块;
  2. 使用from 模块名 import 功能代码,在当前模块再定义一个与导入的功能代码同名的功能代码,那么会把之前导入的功能代码覆盖;
from first_module import sum_num
def sum_num():
    print("哈哈")
sum_num()
---------------------------------Out-------------------------------------
哈哈
模块查找顺序

扩展:获取系统自带模块的路径列表,导入模块有一个模块的查找顺序,返回各个路径的列表,如下:

import sys
result = sys.path
print(result)
-----------------------------------Out-------------------------------------
"""
 ['C:\\Users\\鬼义虎神\\Documents\\黑马程序员工作空间', 
'C:\\Users\\鬼义虎神\\Documents\\黑马程序员工作空间', 
'C:\\Anaconda3\\python37.zip', 'C:\\Anaconda3\\DLLs', 
'C:\\Anaconda3\\lib', 'C:\\Anaconda3', 
'C:\\Users\\鬼义虎神\\AppData\\Roaming\\Python\\Python37\\site-packages', 
'C:\\Anaconda3\\lib\\site-packages', 
'C:\\Anaconda3\\lib\\site-packages\\win32', 
'C:\\Anaconda3\\lib\\site-packages\\win32\\lib', 
'C:\\Anaconda3\\lib\\site-packages\\Pythonwin']
"""
  • C:\\Users\\鬼义虎神\\AppData\\Roaming\\Python\\Python37\\site-packages,是第三方包和模块存放的路径。
  • 假如自己写了个模块,其他工程想导入,只需要把自己模块所在路径添加进去,系统就可以找到了,可以在不同路径下调用了。
import os 
module_path = os.getcwd()+'\\module' # 获取当前路径,并加上模块名称
sys.path.append(module_path)  # 把路径追加到系统路径中

判断是否是主模块

  • 主模块:直接运行的模块就是主模块(__main__)或者成为程序入口模块。用__name__属性的值是否为“__main__”来判断程序是直接执行还是间接执行。
if __name__ == '__main__':
    pass
  • __name__是程序自带属性,如果本程序调用__name__的值是’__main__’;如果其他程序调用此模块,__name__就会变成此模块的名字。
  • 作用:模块有时需要调用自己的方法,而其他程序调用本模块的时候,会先把模块的方法执行一遍,为了避免这种情况加上了上面的判断。