声明:本文章是根据网上资料,加上自己整理和理解而成,仅为记录自己学习的点点滴滴。可能有错误,欢迎大家指正。
一、模块和包的概念与关系
在刚入门python时,模块化编程、模块、类库等术语常常并不容易理清。尤其是Modules(模块)和Packages(包),在import引用时很容易混淆出错。
①模块(Module):是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。
模块目的:为了使代码更容易维护,提高代码重用价值;将函数、变量、类存储在存储在独立的.py文件中,可隐藏代码实现的细节,将不同代码块重新组织,与主程序分离,简化主程序的逻辑,提高主程序的可读性。
②包库(Package):是一个有层次的文件目录结构,它定义了由n个模块或n个子包,和子包下的子包等组成的 Python 的应用环境。
简单来说,包就是文件夹,但该文件夹下必须存在 __init__.py 文件, 该文件的内容可以为空。__init__.py 用于标识当前文件夹是一个包。
有了包和模块文件,可以在其他不同程序中进行复用,还可以使用其他人开发的第三方依赖库。
例如:下图中Learn_python 是个目录,右键,在该目录下可以新建包。
新建后,该目录下存在着包Package1(见绿框)中包含的有test1.py模块和package2(见红框)的包,Package1中下必须存在 __init__.py。
在包(文件夹)中有一个默认内容为空的文件。一般用于描述当前包的信息(在导入他下面的模块时,也会自动加载)。
注意:
- 在python2版本中必须有__init__.py文件,如果没有导入包就会失败
- python3则可有可无(在创建包时,python3会自动给我们创建一个__init__.py文件)
- 为了程序能够正常在任何环境中都能运行,建议加上
从图中,也可看出包和目录的文件夹的图片有些区别,包的文件夹上有个小孔。
③在Python中的函数(Function)、类(Class)、模块(Module)、包库(Package),都是为了实现模块化引用,让程序的组织更清晰有条理。下图是他们几个的关系图:
库:参照其他编程语言的一个喊法;厍完成一定功能的代码集合;具体表现可以是一个模块,也可以是包
框架:一个架构层面的概念;从库功能的角度来着解决一个开放性问题而设计的具有一定约束性的支撑结构。通过一个框架,可以快速实现一个问题解决的骨架;到时按照框架角色去填充,交互就可以完成一个质量好,维护性高的项目。
二、包和模块的分类
(1)标准包和模块(自带的)
安装Python后,自动帮我们安装好的一些模块;可以直接导入使用,比如sys,os。
每个安装Python的用户电脑上都有这些模块。即在你电脑上写的使用某个系统模块的代码, 到其他人电脑上,同样能够运行满足我们基本的功能需求。
如:os包就是“operating system”的缩写,顾名思义,os模块提供的就是各种 Python 程序与操作系统进行交互的接口。os.path 主要用于获取文件的属性。
如下图在test1.py中输入代码:
运行结果:正常,返回test1.py的路径
F:\Python_code\Learn_python\Package1
注意:删除import os,直接写print(os.path.abspath(os.getcwd()))会报错,但特殊的模块不会
(2)特殊:内建包/模块
当我们在编码的过程当中,python自动帮我们导入的模块;如builtins
那么Python的built-in模块又有哪些呢?我们可以在Python中用如下命令查看:
import sys
print(sys.builtin_module_names)
可以看的结果:
('_abc', '_ast', '_bisect', '_blake2', '_codecs', '_codecs_cn', '_codecs_hk', '_codecs_iso2022', '_codecs_jp', '_codecs_kr', '_codecs_tw', '_collections', '_contextvars', '_csv', '_datetime', '_functools', '_heapq', '_imp', '_io', '_json', '_locale', '_lsprof', '_md5', '_multibytecodec', '_opcode', '_operator', '_pickle', '_random', '_sha1', '_sha256', '_sha3', '_sha512', '_signal', '_sre', '_stat', '_statistics', '_string', '_struct', '_symtable', '_thread', '_tokenize', '_tracemalloc', '_typing', '_warnings', '_weakref', '_winapi', '_xxsubinterpreters', 'array', 'atexit', 'audioop', 'binascii', 'builtins',
你会看到一长串builtin模块的名字,这些模块名称是 import
动作最先搜索到的。
我们使用这些功能的时候,不需要手动的导入该模块,直接使用就可以
如我们在test1.py中,直接输入:
print('包1中的test1')
和输入下面的代码的运行结果一样:
import builtins
builtins.print('包1中的test1')
原因是:python自动帮我们导入builtins模块,我们可以直接使用即可。
(2)第三方包和模块(别人开发的)
有些功能,系统模块没有实现,或者实现了,但我们使用起来比较复杂。这时候就有开发人员,开发了一些使用更加方便的模块,供其他人使用。
但要注意的是:如果你的代码使用了某个三方模块,你需要先下载安装,才可使用;到时候,把代码拷贝给别人,别人也需要先安装同样的三方模块后才能运行
可通过 pip install 模块名 联网安装
(3)自定义包和模块(自己开发的)
自己写的模块,当你发布出去给别人使用了,就变成了第三方模块了。