python面向对象(八、包、模块)

12.模块和包
12.1 模块
12.1.1 模块的概念
模块是Python程序架构的一个核心概念,模块的本质就是一个对象
1)每个以py结尾的Python源代码文件都是一个模块,文件名就是模块名
2)模块名是一个标识符,需要符合标识符的命名规则
3)在模块中定义的全局变量、函数、类都是提供给外界直接使用的工具
4)模块就好比是工具包,要想使用这个工具包中的工具,就需要先导入这个模块
5)模块分类:python内置模块、自定义模块、第三方模块

12.1.2 模块的导入方式
12.1.2.1 import 导入
在导入模块时,每个导入应该独占一行
import 模块名1
import 模块名2
一个import后面也可以跟多个模块,但PEP8不建议这样使用
import 模块名1,模块名2

导入之后:
通过“模块名.”使用模块提供的工具:全局变量、函数、类


执行结果:

12.1.2.2使用“as”指定模块的别名(尽量不用)
如果模块的名字太长,可以使用“as”指定模块的名称,以方便在代码中的使用
格式:import 模块名1 as 模块别名
注意:模块别名应该符合大驼峰命名法

12.1.2.3from...import 导入
如果希望从某一个模块中,导入部分工具,就可以使用from...import的方式
import模块名是一次性把模块中所有工具全部导入,并且通过模块名/别名访问
格式:from 模块名 import 工具名
导入之后:不需要通过“模块名.”,可以直接使用模块提供的工具:全局变量、函数、类

注意:
1)如果两个模块,存在同名的函数,那么后导入模块的函数,会覆盖掉先导入的函数
2)开发时import代码应该统一写在代码的顶部,更容易及时发现冲突
3)一旦发现冲突,可以使用as关键字给其中一个工具起一个别名

12.1.2.4 from...import *(知道)
导入模块的所有工具
格式:from 模块名 import *
如果两个模块,存在同名的函数,那么后导入模块的函数,会覆盖掉先导入模块的函数
注意:这种方式不推荐使用,因为函数重名并没有任何的提示,出现问题不好排查

12.1.3 模块导入的过程
1)判断内存中是否有master
2)如果有直接拿来使用
3)如果没有,会开辟一个内存空间。在内存空间中执行模块中的代码
4)默认把名称空间的名字(模块名)引入进来

12.1.4 模块导入的规范
1)导入模块写在py文件的最开始
2)导入模块的顺序:
(1)导入内置模块
(2)导入第三方模块
(3)导入自己定义的模块

12.1.5 模块的搜索顺序[扩展]
Python的解释器在导入模块时,会:
1)搜索当前目录指定模块名的文件,如果有就直接导入
2)如果没有,再搜索系统目录
在开发时,给文件起名,不要和系统的模块文件重名

12.1.6 “file” 属性:
Python中每一个模块都有一个内置属性“file”可以查看模块的完整路径

注意:如果当前目录下,存在一个random.py的文件,程序就无法正常执行了!
Python的解释器会加载当前目录下的random.py而不会加载系统的random模块

12.1.7 “name”属性:判断文件名
1)一个独立的Python文件就是一个模块
在导入文件时,文件中所有没有缩进的代码都会被执行一遍!

2)实际开发场景:
在实际开发中,每一个模块都是独立开发的,大多都有专人负责
开发人员通常会在模块下方增加一些测试代码。仅在模块内使用,而被导入到其他文件中不需要执行

3)__name__属性可以做到:测试模块的代码只在测试情况下被运行,而在被导入时不会被执行!
__name__是Python的一个内置属性,记录着一个字符串:
(1)如果是被其他文件导入的,name__就是模块名
(2)如果是当前执行的程序__name__是__main


4)增加判断语句,避免导入时被执行。

if name == "main": 被称为程序的入口

在很多Python文件中都会看到以下格式的代码:

12.1.8 修改模块中的变量
1)使用global只能修改本当前文件中的变量,无法修改其它文件的变量

2)使用from ...import...导入,可以直接使用的变量

12.1.9 sys.path 模块搜索路径(环境变量)
1)sys.path是python的搜索模块的路径集,是一个list

搜索模块的路径集包括:
(1)当前目录
(2)项目根目录
(3)python解释器目录
(4)自定义添加的目录

2)添加搜索路径sys.path.append(),添加路径后可以正常导入模块了

test123的红色下划线,是由于pycharm软件的搜索路径只有当前文件夹,所以会报错。

3)注意:sys.path随着文件的位置不同,它的模块搜索路径也会发生变化

4)通常python的启动文件放在项目的根目录下,根目录下的文件夹是“包”

12.2 包(Package)
12.2.1 概念
1)包是一个包含多个模块的特殊目录
2)目录下有一个特殊的文件__init__.py
3)包名的命名方式和变量名一致,小写字母、数字 和 “_”
使用import包名,可以一次性导入包中所有的模块
使用from 包名import模块名,可以导入包中某个的模块

12.2.2 init.py
1)导入包时,相当于执行包内__init__.py文件。并不会将包内所有文件放入内存

2)使用包中模块内的变量,需要在__init__.py文件中导入模块
方法一:绝对导入

方法二:相对导入,使用“.”代表同级目录

内含相对导入的文件,被其他文件导入后可以正常使用。

内含相对导入的文件,在当前文件中直接使用被导入的文件,会报错

绝对导入和相对导入的适用情况:
(1)当你写一个功能,这个功能不是直接运行的,而是被其他文件导入后使用的,如果你的这个独立功能形成文件夹,文件夹内所有文件都要使用相对导入。
(2)如果我们自己开发一个项目,这个项目有一些文件是需要直接运行的,这种情况下,适合使用绝对导入
注意:
(1)import包后,使用包名.模块名.变量名。需要在__init__.py文件中写代码,不建议这样使用
(2)建议使用from 包名 import 模块名,这样可以通过“模块名.变量名”,直接使用变量。

12.2.3 创建和使用包
1)新建包:项目名称右击 -> New -> Python Package

2)在包中可以创建py文件(模块)

3)使用包

12.2.4 绝对路径和相对路径导入包
1)绝对路径导入包,从sys.path开始,也就项目文件根目录或当前目录
运行000_test.py

运行test_c.py

2)相对路径导入包,从当前文件夹开始
运行000_test.py

运行test_c.py报错

注意:包的导入,只允许导入运行路径的子文件夹,不允许导入运行路径的父文件夹。为了保护包外面的代码不被修改
我们自己使用一般用绝对路径,第三方开源框架一般使用相对路径

12.2.5 案例演练
1)新建一个“hm_message”的包

2)在目录下,新建两个文件“send_message.py”和“receive_message.py”

3)在send_message文件中定义一个send函数

4)在receive_message文件中定义一个receive函数

5)在外部直接导入hm_message的包
(1)在__init__.py中指定对外界提供的模块列表
要在外界使用包中的模块,需要在__init__.py中指定对外界提供的模块列表

(2)输入时,会有相应提示

posted on 2020-12-02 16:00  叮当2000  阅读(225)  评论(0编辑  收藏  举报