9.模块与包

0 阅读7分钟

1. 模块概述

  • 定义:Python中一个以.py结尾的源文件即为一个模块(Module),可以包含变量、函数和类等。其实就是说一个文件就是一个模块
  • 优点:提高代码的可维护性和复用性,避免名称冲突。只需编写一次,其他程序即可导入使用。

2. 模块的使用

2.1 创建模块

模块名区分大小写,且不能与Python自带的标准模块重名。

# 示例:my_add.py
num = 100
def add(a, b):
    """求两个数的和"""
    return a + b

2.2 导入模块

(1)全部导入 import

  • 语法import 模块名 as 别名 后面的as 别名 你要用的话就要,不用的话就不要。
  • 调用模块名.成员名别名.成员名
  • 特点:即使多次使用 import 导入同一模块,模块也只会被导入一次。
# 导入模块
import my_add as a1

# 使用模块
print(a1.add(1, 2))
print(a1.num)

(2)局部导入 from import

  • 语法from 模块名 import 成员名1 [as 别名], ... [as 别名] 需要起别名就要,不需要起别名就不要
  • 调用:直接通过 成员名 调用。
  • 特点:只能使用其导入的成员。如果多个模块存在重名成员,后一次导入会覆盖前一次。
#创建新的模块my_multi.py
num =200
_str1="abc"
def multi(a, b):
    """求两个数的积"""
    return a * b

只能使用导入的成员

#只能使用导入的成员
from my_add import add 
print(add(1, 2))
print(num) # NameError: name 'num' is not defined

重名变量,后一次导入会覆盖前一次导入

# 导入模块
from my_add import add,num 
from my_multi import num

(3)全部局部导入 from import *

  • 语法from 模块名 import *
  • 特点:导入模块中所有不以单下划线开头的成员。

2.3 模块搜索顺序

当导入模块时,系统会按以下顺序查找:

  1. 当前目录。
  2. PYTHONPATH 环境变量中的目录。
  3. 标准库及依赖目录。

提示:可通过 import sys; print(sys.path) 查看搜索顺序,或通过 sys.path.append("路径") 临时添加搜索路径。


3. 模块内置属性和内置函数

3.1 __all__ 变量

专门针对 from import * 生效,用于设置模块中哪些内容允许被导入。

# my_add.py
__all__ = ["num", "add"]  # 列表内为字符串形式

3.2 __name__ 变量

特殊内置变量,用于判断文件是被直接运行还是作为模块被导入。

  • 直接运行:该文件的 __name__ 属性值为 "__main__",也就是直接运行的就是这个文件,这个相当于核心启动文件
  • 被导入时:该文件的 __name__ 属性值为模块的名称(文件名)。

典型用法:避免导入模块时测试代码被直接执行。

if __name__ == "__main__":
    # 这里的代码只有在直接运行当前文件时才会执行
    print(add(10, 20))

3.3 dir() 函数

dir() 是一个内置函数,主要用于列出对象的属性和方法,或者列出当前作用域中定义的名称,并以一个字符串列表的形式返回。 当你将一个模块作为 dir() 的参数时,它会返回该模块中定义的名称列表,包括函数、类、变量等

  • dir(模块):返回该模块中定义的名称列表。
  • dir(对象):返回该对象的属性和方法列表。
  • dir():不带参数,列出当前作用域定义的名称。

4. 包 (Package)

4.1 包概述

包是一种管理Python模块命名空间的形式,通过 .模块名(如 A(包名).B(文件名))来组织。通常我们将多个有联系的模块放入一个包中,构成一个包,和别的语言的包的没啥区别。

  • 核心特征:包与文件夹相似,但文件夹下必须包含一个 __init__.py 文件(可以为空)。
  • 结构示例
    sound/                          最高层级的包
      __init__.py               初始化 sound 包
      formats/                  用于文件格式转换的子包
        __init__.py
        wavread.py
        ...
      effects/                  用于音效的子包
        __init__.py
        echo.py
        ...
    

4.2 创建包

和创建py 文件一样,可以创建包。创建包以后IDE会自动给你生成一个__init__.py,这个文件可以作为一个标识,Python 解释器就会将该文件夹视为一个包(Package) ,而不是一个普通的目录。也可以 包的初始化(Initialization) : 当你第一次导入这个包或者包里的任何模块时,__init__.py 中的代码会自动被执行一次。因此,它常用来做一些初始化工作。还可以控制包的导出接口(Public API): 用来决定对外暴露哪些模块、类或函数,隐藏内部实现细节。其他后面的两点和别的包的作用差不多。

4.3 导入包

假设有包 graphic 及其下的模块 circle

  • 全局导入import graphic.circle -> 调用:graphic.circle.area(10)
  • 局部导入模块from graphic import circle -> 调用:circle.area(10)
  • 局部导入成员from graphic.circle import area -> 调用:area(10)\

上面的局部导入是导入单个成员,如果想导入所有的子模块,很容易想到使用 from 包名 import * , 实际这样写Python并不会查找并导入包的所有子模块,因为这将花费很长的时间,并且可能会产生我们不想要的副作用,唯一的解决办法是提供包的显式索引。如果包的 init.py 中定义了 all,运行 from import * 时,它就是被导入的模块名列表.必须要配合 __init__.py 文件中的 __all__ = ["模块名1", "模块名2"] 才能生效。

# graphic/__init__.py
__all__ = ["circle"]  # 只允许星号导入 circle 模块

# main.py
from graphic import * # 语法:from 包名 import *

print(circle.area(10))    # 正常运行
print(rectangle.area(10)) # 报错,因为 rectangle 不在 __all__ 列表中,没有被导入


5. 标准库与第三方库

5.1 常用标准库

Python安装时自带的库:

  • os, sys:操作系统接口与系统参数
  • time, datetime:时间与日期操作
  • math, random:数学和随机数
  • json:JSON编码器和解码器
  • re:正则表达式
  • collections:增强型容器
  • functools:高阶函数,以及可调用对象上的操作
  • hashlib:安全哈希与消息摘要
  • urllib, socket, smtplib:URL处理、低层级网络接口与邮件处理
  • zlib, gzip, bz2:各类数据压缩与解压支持
  • multiprocessing, threading:基于进程与线程的并行
  • copy:浅层及深层拷贝操作
  • shutil, glob:高阶文件操作及 Unix 风格路径模式扩展

5.2 引入第三方库

pip (Package Installer for Python) 是 Python 官方推荐的包管理工具。它就像是手机上的“应用商店”,让你能够非常方便地查找、下载、安装和卸载第三方的 Python 代码库(比如 requestsnumpy 等)。

以下是我们在日常开发中最常用到的 pip 操作:

1. 基础命令(增删改查)

  • 安装包
    pip install 包名
    # 示例:pip install requests
    
  • 卸载包
    pip uninstall 包名
    # 示例:pip uninstall requests
    
    执行时会提示你输入 y 确认卸载。
  • 查看已安装的包
    pip list
    
    这会列出当前环境下所有安装的第三方库以及它们的版本号。
  • 查看某个包的具体信息(如版本、安装路径、依赖项)
    pip show 包名
    

2. 版本控制与更新

  • 安装指定版本的包 如果最新的包和你的代码不兼容,你可以指定版本号:
    pip install 包名==版本号
    # 示例:pip install django==3.2.0
    
    (还可以用 >=<= 限制版本范围)
  • 更新已安装的包到最新版
    pip install --upgrade 包名
    # 或者简写为:pip install -U 包名
    

3. 项目依赖管理(非常重要)

当你把代码发给同事或部署到服务器时,别人需要知道你的代码依赖了哪些包。

  • 导出当前环境的所有包到文件(通常命名为 requirements.txt
    pip freeze > requirements.txt
    
  • 别人拿到代码后,一键安装所有依赖
    pip install -r requirements.txt
    

4. 解决下载慢的问题(换源)

因为 pip 默认从国外的官方服务器下载包,国内经常会遇到下载极慢甚至断开报错(Timeout)的情况。通常我们会把下载源切换到国内的镜像站。

常用的国内镜像源:

  • 清华大学https://pypi.tuna.tsinghua.edu.cn/simple
  • 阿里云http://mirrors.aliyun.com/pypi/simple/
  • 豆瓣http://pypi.douban.com/simple/

方法一:单次临时使用(在安装命令后加上 -i 参数)

pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple

方法二:永久配置(推荐,一劳永逸)

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

设置完毕后,以后直接 pip install 就会自动从国内源飞速下载了。