Python---- 模块(module)和包(package)

本文深入讲解Python中的模块化编程概念,包括模块的构成、标准库模块介绍、模块化编程的优势及流程,同时详细阐述了模块的导入方式及其区别,包的使用方法等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模块

一、模块化(module)

1、python 程序的构成

在这里插入图片描述

  1. Python 程序由模块组成。一个模块对应 python 源文件,一般后缀名是:.py。
  2. 模块由语句组成。运行 Python 程序时,按照模块中语句的顺序依次执行。
  3. 语句是 Python 程序的构造单元,用于创建对象、变量赋值、调用函数、控制语句等。
2、标准库模块

​ 与函数类似,模块也分为标准库模块和用户自定义模块。
Python 标准库提供了操作系统功能、网络通信、文本处理、文件处理、数学运算等基
本的功能。比如:random(随机数)、math(数学运算)、time(时间处理)、file(文件处理)、
os(和操作系统交互)、sys(和解释器交互)等。
另外,Python 还提供了海量的第三方模块,使用方式和标准库类似。功能覆盖了我们
能想象到的所有领域,比如:科学计算、WEB 开发、大数据、人工智能、图形系统等。

3、模块化编程

​ 模块(module)对应于 Python 源代码文件(.py 文件)。模块中可以定义变量、函数、类、普通语句。 这样,我们可以将一个 Python 程序分解成多个模块,便于后期的重复应用。
​ 模块化编程(Modular Programming)将一个任务分解成多个模块。每个模块就像一个积木一样,便于后期的反复使用、反复搭建。

模块化编程有如下几个重要优势:

  1. 便于将一个任务分解成多个模块,实现团队协同开发,完成大规模程序
  2. 实现代码复用。一个模块实现后,可以被反复调用。
  3. 可维护性增强。

模块化编程的一般流程:

  1. 设计 API,进行功能描述。
  2. 编码实现 API 中描述的功能。
  3. 在模块中编写测试代码,并消除全局代码。
  4. 使用私有函数实现不被外部客户端调用的模块函数。

​ 模块中的API(Application Programming Interface 应用程序编程接口)是用于描述模块中提供的函数和类的功能描述和使用方式描述。
模块化编程中,首先设计的就是模块的 API(即要实现的功能描述),然后开始编码实现 API 中描述的功能。最后,在其他模块中导入本模块进行调用。

#通过help()查看模块的API,以 math 模块为例
import math
help(math)

可以用 doc 来查看在导入模块里的说明

import API_test
print(API_test.__doc__)
print(API_test.yearsalary.__doc__)

​ 每个模块都有一个名称,通过特殊变量__name__可以获取模块的名称。在正常情况模块名字对应源文件名。 仅有一个例外,就是当一个模块被作为程序入口时(主程序、交互式提示符下),它的__name__的值为“main”,也就是在自己的模块里运行__name__ 时为__main__,在被引用时为对应源文件名。我们可以根据这个特点,将模块源代码文件中的测试代码进行独立的处理。、

company = "北京尚学堂" 
def yearSalary(monthSalary): """根据传入的月薪,计算出年薪"""
	return monthSalary*12
def daySalary(monthSalary): """根据传入的月薪,计算出每天的薪资"""
	return monthSalary/22.5 #国家规定每个月的平均工作日是 22.5
if __name__ =="__main__":    #测试代码,不被别的模块所调用,只能自己调用
    print(yearSalary(3000))
    print(daySalary(3000))

二、模块的导入

​ 模块化设计的好处之一就是“代码复用性高”。写好的模块可以被反复调用,重复使用。
模块的导入就是“在本模块中使用其他模块”。

1、import 语句导入

import 语句的基本语法格式如下:
​ import 模块名 #导入一个模块
​ import 模块 1,模块 2… #导入多个模块
​ import 模块名 as 模块别名 #导入模块并使用新名字

import 加载的模块分为四个通用类别:
​ a.使用 python 编写的代码(.py 文件);
​ b.已被编译为共享库或 DLL 的 C 或 C++扩展;
​ c.包好一组模块的包
​ d.使用 C 编写并链接到 python 解释器的内置模块;

​ 我们一般通过 import 语句实现模块的导入和使用,import 本质上是使用了内置函数__import__()。当我们通过 import 导入一个模块时,python 解释器进行执行,最终会生成一个对象,这个对象就代表了被加载的模块。

import math
print(id(math))
print(type(math))
print(math.pi) #通过 math.成员名来访问模块中的成员

执行结果是:
31840800
<class 'module'>
#也可以用别名来调用
import math as m
print(m.sqrt(4)) #开方运算
2、from… import 导入

​ Python 中可以使用 from…import 导入模块中的成员。基本语法格式如下:
​ from 模块名 import 成员 1,成员 2,…

​ 如果希望导入一个模块中的所有成员,则可以采用如下方式:
​ from 模块名 import *

【注】尽量避免“from 模块名 import ”这种写法。 它表示导入模块中所有的不是以下划线(_)开头的名字都导入到当前位置。 但你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。而且可读性极其的差。一般生产环境中尽量避免使用,学习时没有关系。

#导入指定成员
from math import pi,sin
print(sin(pi/2)) #输出 1.0
3、import 语句和 from…import 语句的区别

import 导入的是模块from…import 导入的是模块中的一个函数/一个类。如果进行类比的话,import 导入的是“文件”,我们要使用该“文件”下的内容,必须前面加“文件名称”。from…import 导入的是文件下的“内容”,我们直接使用这些“内容”即可,前面再也不需要加“文件名称”了。

# import math
# print(math.sin(30))

from math import sin
print(sin(30))
4、import () 动态导入

​ import 语句本质上就是调用内置函数__import__(),我们可以通过它实现动态导入。给
import()动态传递不同的的参数值,就能导入不同的模块。

s = "math" 
m = __import__(s) #导入后生成的模块对象的引用给变量 m
print(m.pi)

注意:一般不建议我们自行使用__import__()导入,其行为在 python2 和 python3 中有差异,会导致意外错误。如果需要动态导入可以使用 importlib 模块。

import importlib
a = importlib.import_module("math")
print(a.pi)

5、模块的加载问题

​ 当导入一个模块时, 模块中的代码都会被执行。不过,如果再次导入这个模块,则不会再次执行Python 的设计者为什么这么设计?因为,导入模块更多的时候需要的是定义模块中 的 变 量 、 函 数 、 对 象 等 。 这 些 并 不 需 要 反 复 定 义 和 执 行 。 “ 只 导 入 一 次import-only-once”就成了一种优化。

​ 一个模块无论导入多少次,这个模块在整个解释器进程内有且仅有一个实例对象。

import test02   #会执行test02中的语句,
import test02   #第二次不会再执行test02中的语句	

重新加载: 有时候我们确实需要重新加载一个模块时,这时候可以使用:importlib.reload()方法:

import test02
import test02
print("####")
import importlib
importlib.reload(test02)	

三、包 package 的使用

1、包的概念

​ 当一个项目中有很多个模块时,需要再进行组织。我们将功能类似的模块放到一起,形成了“包”。本质上,“包”就是一个必须有__init__.py 的文件夹。包下面可以包含“模块(module)”,也可以再包含“子包(subpackage)”。就像文件夹下面可以有文件,也可以有子文件夹一样。

2、包的导入

我们需要导入 module_AA.py。方式如下:

  1. import a.aa.module_AA
    在使用时,必须加完整名称来引用,比如:a.aa.module_AA.fun_AA()
  2. from a.aa import module_AA
    在使用时,直接可以使用模块名。 比如:module_AA.fun_AA()
  3. from a.aa.module_AA import fun_AA 直接导入函数
    在使用时,直接可以使用函数名。 比如:fun_AA()

【注】

  1. from package import item 这种语法中,item 可以是包、模块,也可以是函数、类、变量。
  2. import item1.item2 这种语法中,item 必须是包或模块,不能是其他。

​ 导入包的本质其实是“导入了包的__init__.py”文件。也就是说,”import pack1”意味着执行了包 pack1 下面的__init__.py 文件。 这样,可以在__init__.py 中批量导入我们需要的模块,而不再需要一个个导入。

init.py 的三个核心作用

  1. 作为包的标识,不能删除。

  2. 用来实现模糊导入

  3. 导入包实质是执行__init__.py 文件,可以在__init__.py 文件做这个包的初始化、以及需要统一执行代码、批量导入。

a 包下的__init__.py 文件内容:

import turtle
import math
print("导入a包")

b 包下的 module_B1.py 文件中导入 a 包,代码如下:​

import a
print(a.math.pi)	

执行结果如下:
导入 a 包
3.141592653589793

**【注】**如上测试我们可以看出 python 的设计者非常巧妙的通过__init__.py 文件将包转成了模块的操作。因此,可以说“包的本质还是模块”

3、用*导入包

​ import * 这样的语句理论上是希望文件系统找出包中所有的子模块,然后导入它们。这可能会花长时间等Python 解决方案是提供一个明确的包索引。这个索引由 init.py 定义 all 变量,该变量为一列表,如上例 a 包下的
init.py 中,可定义 all = [“module_A”,“module_A2”]这意味着, from sound.effects import * 会从对应的包中导入以上两个子模块;

**【注】**尽管提供 import * 的方法,仍不建议在生产代码中使用这种写法。

4、包内引用

​ 如果是子包内的引用,可以按相对位置引入子模块 以 aa 包下的 module_AA 中导入 a包下内容为例:

from … import module_A #…表示上级目录 .表示同级目录
from . import module_A2 #.表示同级目录

5、sys.path 和模块搜索路径

​ 当我们导入某个模块文件时, Python 解释器去哪里找这个文件呢?只有找到这个文件才能读取、装载运行该模块文件。它一般按照如下路径寻找模块文件(按照顺序寻找,找到即停不继续往下寻找):

  1. 内置模块
  2. 当前目录
  3. 程序的主目录
  4. pythonpath 目录(如果已经设置了 pythonpath 环境变量)
  5. 标准链接库目录
  6. 第三方库目录(site-packages 目录)
  7. .pth 文件的内容(如果存在的话)
  8. sys.path.append()临时添加的目录

​ 当任何一个 python 程序启动时,就将上面这些搜索路径(除内置模块以外的路径)进行收集,
放到 sys 模块的 path 属性中(sys.path)。

  • 使用 sys.path 查看和临时修改搜索路径
import sys
sys.path.append("d:/")
print(sys.path)

在这里插入图片描述

  • pythonpath 环境变量的设置

windows 系统中通过如下操作添加和设置 pythonpath 环境变量。

  • .pth 文件的写法

    我们可以在 site-packages 目录下添加.pth 文件。并在文件中增加内容:

    #一行一个目录

    g:\a

    g:\b

    g:\c

​ 【注】

  1. 需确保 g:\a,g:\b,g:\c 对应的目录真实存在。
  2. 在 windows 系统中建立.pth 文件,由于没有文件名不能直接建立。需要输入:

“.pth.”才能正常建立.pth 文件。

四、模块的发布和安装

1、模块本地发布

​ 当我们完成了某个模块开发后,可以将他对外发布,其他开发者也可以以“第三方扩展库”的方式使用我们的模块。我们按照如下步骤即可实现模块的发布:

1.为模块文件创建如下结构的文件夹(一般,文件夹的名字和模块的名字一样):

在这里插入图片描述

2.在文件夹中创建一个名为『setup.py』的文件,内容如下:

from distutils.core import setup
setup(
    name='baizhanMath2', # 对外我们模块的名字
    version='1.0', # 版本号
    description='这是第一个对外发布的模块,测试哦', #描述
    author='gaoqi', # 作者
    author_email='gaoqi110@163.com', 
    py_modules=['baizhanMath2.demo1','baizhanMath2.demo2'] # 要发布的模块
)

3.构建一个发布文件。通过终端,cd 到模块文件夹 c 下面,再键入命令:
python setup.py sdist

执行完毕后,目录结构变为:

在这里插入图片描述

2、本地安装

​ 将发布安装到你的本地计算机上。仍在 cmd 命令行模式下操作,进 setup.py 所在目录,键入命令:
​ python setup.py install
安装成功后,我们进入 python 目录/Lib/site-packages 目录(第三方模块都安装的这里,python 解释器执行时也会搜索这个路径):
在这里插入图片描述
安装成功后,直接使用 import 导入即可。
import baizhanMath2.demo1

3、上传到PyPI

​ 将自己开发好的模块上传到 PyPI 网站上,将成为公开的资源,可以让全球用户自由使用。按照如下步骤做,很容易就实现上传模块操作。

  • 注册 PyPI 网站
  • 创建用户信息文件.pypirc

·方式 1: 使用命令(适用 Linux)
输入并执行后 python setup.py register ,然后输入用户名和密码,即可。
·方式 2:使用文件(适用 windows,Linux)
在用户的家目录里创建一个文件名为.pypirc, 内容为:
[distutils]
index-servers=pypi
[pypi]
repository = https://upload.pypi.org/legacy/
username = 账户名
password = 你自己的密码
【注】Linux 的家目录: ~/.pypirc
​ Windows 的家目录是: c:/user/用户名
​ 在 windows 下直接创建不包含文件名的文件会失败,因此创建时文件名为“.pypirc.”,前后都有两个点即 可。

  • 上传并远程发布

    进入 setup.py 文件所在目录,使用命令“python setup.py sdist upload”,即可以将模块代码上传并发布。

  • 管理你的模块

    我们登录 pypi 官网,可以看到:
    如果你的模块已经上传成功,那么当你登录 PyPI 网站后应该能在右侧导航栏看到管理入口。

4、让别人使用你的模块

​ 模块发布完成后,其他人只需要使用 pip 就可以安装你的模块文件。比如:
​ pip install package-name

​ 如果你更新了模块,别人可以可以通过–update 参数来更新:

​ pip install package-name update

Modular Programming with Python by Erik Westra English | 2016 | ISBN: 1785884484 | 246 pages | EPUB | 3 MB Introducing modular techniques for building sophisticated programs using Python About This Book • The book would help you develop succinct, expressive programs using modular deign • The book would explain best practices and common idioms through carefully explained and structured examples • It will have broad appeal as far as target audience is concerned and there would be take away for all beginners to Python Who This Book Is For This book is intended for beginner to intermediate level Python programmers who wish to learn how to use modules and packages within their programs. While readers must understand the basics of Python programming, no knowledge of modular programming techniques is required. What You Will Learn • Learn how to use modules and packages to organize your Python code • Understand how to use the import statement to load modules and packages into your program • Use common module patterns such as abstraction and encapsulation to write better programs • Discover how to create self-testing Python packages • Create reusable modules that other programmers can use • Learn how to use GitHub and the Python Package Index to share your code with other people • Make use of modules and packages that others have written • Use modular techniques to build robust systems that can handle complexity and changing requirements over time In Detail Python has evolved over the years and has become the primary choice of developers in various fields. The purpose of this book is to help readers develop readable, reliable, and maintainable programs in Python. Starting with an introduction to the concept of modules and packages, this book shows how you can use these building blocks to organize a complex program into logical parts and make sure those parts are working correctly together. Using clearly written, real-world examples, this book demonstrates how you can
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值