一、模块

何为模块?

模块是最高级别的程序组织单元;在python中,模块一般是python或C或Java等语言编写的扩展文件,这个扩展文件可以被导入使用。

为何使用模块?

模块首先是一个文件,这个文件可以在多种环境下任意次数地重新载入和重新运行,这就是说,模块可被重用;其次,模块作为python中最高级别的程序组织单元,在每一次导入时,客户端只需导入模块,就能使用模块定义的变量名以及变量名所引用的对象。

模块的导入前提

1、导入模块是由python自身提供的,在python标准链接库中。 2、模块导入的两个语句(import和from) 3、初次导入模块时,需要先找到要导入的模块文件,在sys.path的路径中 寻找。 4、python把载入的模块存储到sys.modules中,在每次导入操作开始前检查该字典,如果不存在,会执行导入操作,如果存在,不执行任何操作。 5、模块文件的选择:如要导入的模块在sys.path字典的第一个路径和第三个路径中同时出现,只会导入第一个路径中的模块。

模块导入之import语句

import将整个模块对象赋值给一个变量名 1、import 模块名

>>> import sys
>>> print(sys.path)
['', 'C:\\Python37\\python37.zip', 'C:\\Python37\\DLLs', 'C:\\Python37\\lib', 'C:\\Python37', 'C:\\Python37\\lib\\site-packages']

2、import 模块名 as 别名

>>> import sys as systemctl
>>> print(systemctl.path)
['', 'C:\\Python37\\python37.zip', 'C:\\Python37\\DLLs', 'C:\\Python37\\lib', 'C:\\Python37', 'C:\\Python37\\lib\\site-packages']

3、import 模块1,模块2

>>> import sys,os

模块导入之from语句

from将一个或多个变量名赋值给另一个模块中同名的对象 1、from 模块名 import 变量名 直接使用变量名就可以完成操作 如果本文件中有相同的变量名会发生冲突

>>> from sys import path
>>> print(path)
['', 'C:\\Python37\\python37.zip', 'C:\\Python37\\DLLs', 'C:\\Python37\\lib', 'C:\\Python37', 'C:\\Python37\\lib\\site-packages']

2、from 模块名 import 变量名字 as 别名

>>> from sys import path as systempath
>>> print(systempath)
['', 'C:\\Python37\\python37.zip', 'C:\\Python37\\DLLs', 'C:\\Python37\\lib', 'C:\\Python37', 'C:\\Python37\\lib\\site-packages']

3、from 模块名 import 变量1,变量2

>>> from os import path,kill

4、from 模块名 import * 将模块中的所有变量名都放到内存中 如果本文件中有相同的变量名会发生冲突

>>> from os import path,kill

5、from 模块名 import * 和__all__ 没有all这个变量就会导入所有的变量 如果有all变量,只导入all列表中的变量

模块导入流程

1、先从sys.modules里查看是否已经被导入 2、在sys.path的目录中找到模块 3、创建这个模块的命名空间 4、把文件中的名字放入命名空间

何为模块命名空间

每一个模块就是一个命名空间,存在于模块之内的变量名就是模块对象的属性 1、模块语句会在首次导入时执行 2、顶层的赋值语句会创建模块属性 3、模块的命名空间能通过属性__dict__或dir()来获取 4、模块文件的作用域就是模块对象的属性的命名空间,即每一个模块都是独立的作用域

二、包

我们知道通过import和from语句可以导入模块,用法时直接在语句后跟要导入的模块名,那么我们如果要导入目录路径呢?也是可以的,python代码的目录就称为包,因此,这类导入称之为包导入。包导入是将要导入的目录创建为一个新的命名空间,目录中的子目录和模块文件就是命名空间的属性。

包的导入

包的导入与模块的导入类似,只是加上了目录层级

import dir1.dir2.pic
from dir1.dir2 import pic

导入包的路径与导入模块一致 就是说dir1所在的目录必须在sys.path中

init.py文件

包导入语句的路径中的每个目录内都必须有__init__.py文件,否则导入包就会失败;示例中dir1和dir2的目录下必须有__init__.py文件

包的初始化

导入包时,会自动执行该目录下__init__.py文件中的所有代码,因此这个文件是放置导入包时初始化的代码,比如写入导入其他目录及模块

包的相对路径导入

在上面的导入中,是从顶层目录向下逐步找到要导入的文件的,给出的是绝对路径;包也可以相对路径导入,类似于linux系统中 “.” 与“..”。

from ..import pic

相对导入只适用于包内部导入,且只适用于from语句 init文件中如使用相对路径导入,在包的外部导入没问题,在包内部使用也需使用相对路径 如使用绝对路径导入,在内部或外部使用都没问题

三、__name__变量

在模块中有个变量__name__ 当我们直接执行这个模块的时候,name=='main' 当我们执行其他模块,在其他模块中引用这个模块的时候,这个模块中的__name__=='模块的名字'