一、模块
模块是 Python 程序架构的一个核心概念
每一个以扩展名 py 结尾的 Python 源代码文件都是一个 模块
模块名 同样也是一个 标识符,需要符合标识符的命名规则
在模块中定义的 全局变量 、函数、类 都是提供给外界直接使用的 工具
模块 就好比是 工具包,要想使用这个工具包中的工具,就需要先 导入 这个模块
1.1. 导入模块
1.1.1 导入模块的方式
import 模块名
from 模块名 import 功能名
from 模块名 import *
import 模块名 as 别名
from 模块名 import 功能名 as 别名
导入之后
通过 模块名. 使用 模块提供的工具 —— 全局变量、函数、类
1.1.2 导入方式详解
1.1.2.1 import (导入全部功能)
- 语法
# 1. 导入模块 import 模块名 import 模块名1, 模块名2... # 2. 调用功能 模块名.功能名()
- 示例
import math print(math.sqrt(9)) # 3.0
1.1.2.2 from…import… (导入部分功能)
- 语法
# 从 模块 导入 某一个工具 from 模块名 import 功能1, 功能2, 功能3...
- 导入之后
- 不需要 通过
模块名.
- 可以直接使用 模块提供的工具 —— 全局变量、函数、类
- 示例
from math import sqrt print(sqrt(9)) # 3.0
1.1.2.3 from … import *
- 语法
# 从 模块 导入 所有工具 from 模块名 import *
这种方式不推荐使用,因为函数重名并没有任何的提示,出现问题不好排查
- 示例
from math import * print(sqrt(9)) # 3.0
1.1.2.4 as定义别名
- 语法
# 模块定义别名 import 模块名 as 别名 # 功能定义别名 from 模块名 import 功能 as 别名
- 示例
# 模块别名 import time as tt tt.sleep(2) print('hello') # 功能别名 from time import sleep as sl sl(2) print('hello')
1.2. 制作模块
- 在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字。
- 也就是说自定义模块名必须要符合标识符命名规则。
1.2.1 定义模块
新建一个Python文件,命名为my_module1.py
,并定义testA
函数。
def testA(a, b): print(a + b)
1.2.2 测试模块(__name__)
在实际开中,当一个开发人员编写完一个模块后,为了让模块能够在项目中达到想要的效果,这个开发人员会自行在py文件中添加一些测试信息.,例如,在my_module1.py文件中添加测试代码。
def testA(a, b): print(a + b) # 测试信息 testA(1, 1)
此时,无论是当前文件,还是其他已经导入了该模块的文件,在运行的时候都会自动执行testA
函数的调用。
解决办法如下:
def testA(a, b): print(a + b) # 只在当前文件中调用该函数,其他导入的文件内不符合该条件,则不执行testA函数调用 if __name__ == '__main__': testA(1, 1)
__name__
是系统变量,是模块的标识符,是Python
的一个内置属性,记录着一个字符串。它的值分为两种情况:
- 如果 是被其他文件导入的,__name__ 就是 模块名
- 如果 是当前执行的程序 __name__ 是 __main__.
1.2.3 调用模块
import my_module1 my_module1.testA(1, 1)
1.2.4 注意事项
如果使用from .. import ..
或from .. import *
导入多个模块的时候,且模块内有同名功能。当调用这个同名功能的时候,调用到的是后面导入的模块的功能。
- 示例
# 模块1代码 def my_test(a, b): print(a + b) # 模块2代码 def my_test(a, b): print(a - b) # 导入模块和调用功能代码 from my_module1 import my_test from my_module2 import my_test # my_test函数是模块2中的函数 my_test(1, 1)
1.3. 模块定位顺序
当导入一个模块,Python解析器对模块位置的搜索顺序是:
当前目录
如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。
如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/
模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。
注意
自己的文件名不要和已有模块名重复,否则导致模块功能无法使用
使用from 模块名 import 功能的时候,如果功能名字重复,调用到的是最后定义或导入的功能。
# 拓展: 名字重复 # 问题:import 模块名 是否担心 功能名字重复的问题 -- 不需要 import time print(time) time = 1 print(time) # 问题:为什么变量也能覆盖模块? -- 在Python语言中,数据是通过 引用 传递的。
<module ‘time’ (built-in)>
1
1.4. __all__
如果一个模块文件中有__all__
变量,当使用from xxx import *
导入时,只能导入这个列表中的元素。
- my_module1模块代码
# 定义多个功能,把某个功能添加到__all__ __all__ = ['testA'] def testA(): print('testA') def testB(): print('testB')
- 导入模块的文件代码
from my_module1 import * testA() # 因为testB函数没有添加到all列表,只有all列表里面的功能才能导入 testB()
testA
NameError: name ‘testB’ is not defined
二、包(Package)
2.1 概念
包:将有联系的模块组织在一起,即放到同一个文件夹下,并且在这个文件夹创建一个名字为__init__.py 文件,那么这个文件夹就称之为包。
包 是一个 包含多个有联系的模块组织在一起 的 特殊目录(文件夹)
目录下有一个 特殊的文件 __init__.py
包名的 命名方式 和变量名一致,小写字母 + _
好处
使用 import 包名 可以一次性导入 包 中 所有的模块
2.2 制作包
[New] — [Python Package] — 输入包名 — [OK] — 新建功能模块(有联系的模块)。
注意:新建包后,包内部会自动创建__init__.py文件,这个文件控制着包的导入行为。
示例
新建包mypackage
新建包内模块:my_module1 和 my_module2
- 模块内代码如下
# my_module1 print(1) def info_print1(): print('my_module1')
# my_module2 print(2) def info_print2(): print('my_module2')
2.3 导入包
2.3.1 方法一
# 导入 import 包名.模块名 # 调用功能 包名.模块名.功能名()
- 示例
import my_package.my_module1 my_package.my_module1.info_print1()
2.3.2 方法二
注意:必须在__init__.py
文件中添加__all__ = []
,控制允许导入的模块列表。
from 包名 import * 模块名.功能名()
- 示例
from my_package import * my_module1.info_print1()
三、发布模块(知道)
- 如果希望自己开发的模块,分享 给其他人,可以按照以下步骤操作
3.1 制作发布压缩包步骤
1) 创建 setup.py
setup.py
的文件
from distutils.core import setup # 多值字典参数,每一个参数之间用逗号分隔 setup(name="hm_message", # 包名 version="1.0", # 版本 description="itheima's 发送和接收消息模块", # 描述信息 long_description="完整的发送和接收消息模块", # 完整描述信息 author="LiYang", # 作者 author_email="123@163.com", # 作者邮箱 url="www.qq.com", # 主页 py_modules=["hm_message.send_message", "hm_message.receive_message"]) # 包中,包含的模块;把包中包含的模块全部写上去
有关字典参数的详细信息,可以参阅官方网站:
https://docs.python.org/2/distutils/apiref.html
2) 构建模块
- 进入到发布模块这个目录,在终端中执行下面命令
$ python3 setup.py build
3) 生成发布压缩包
- 进入到发布模块这个目录,在终端中执行下面命令
$ python3 setup.py sdist
注意:要制作哪个版本的模块,就使用哪个版本的解释器执行!
3.2 安装模块
$ tar -zxvf hm_message-1.0.tar.gz # 解压缩(拿到的压缩包) $ sudo python3 setup.py install # 在解压下的文件中进行
3.3 卸载模块
直接从安装目录下,把安装模块的 目录 删除就可以
$ cd /usr/local/lib/python3.5/dist-packages/ $ sudo rm -r hm_message*
3.4 pip 安装第三方模块
第三方模块 通常是指由 知名的第三方团队 开发的 并且被 程序员广泛使用 的 Python 包 / 模块
例如 pygame 就是一套非常成熟的 游戏开发模块
pip 是一个现代的,通用的 Python 包管理工具
提供了对 Python 包的查找、下载、安装、卸载等功能
安装和卸载命令如下:
# 将模块安装到 Python 2.x 环境 $ sudo pip install pygame $ sudo pip uninstall pygame # 将模块安装到 Python 3.x 环境 $ sudo pip3 install pygame $ sudo pip3 uninstall pygame
1)在 Mac
下安装 iPython
$ sudo pip install ipython
2)在 Linux
下安装 iPython
$ sudo apt install ipython $ sudo apt install ipython3
四、总结
- 导入模块方法
import 模块名 from 模块名 import 功能名 from 模块名 import *
- 导入包
import 包名.模块名 from 包名 import *
__all__ = []
:允许导入的模块或功能列表