发布于2026-07-21 阅读(0)
扫一扫,手机访问
这篇文章来系统讲讲Python里的模块与包——从概念到实战,一步到位。你会搞清楚模块到底是什么、里面能装什么、怎么分类(标准库、自定义、第三方)、怎么命名、怎么定义和测试自己写的模块。接着深入探讨各种导入方式、搜索路径的先后顺序,以及那个神秘的__all__到底有什么用。再往后,包的定义、导入方式、__init__.py的作用也会一一拆解,最后还会聊聊在全局环境和虚拟环境里怎么安装第三方库。读完这一篇,模块化编程的知识体系基本就搭起来了。

在Python里,模块(Module)说白了就是一个.py文件,里面装着Python代码——函数、类、变量,甚至直接可执行的语句。模块的核心价值,就是把相关的代码收拢到一起,方便复用,也让逻辑更清晰。
你可以把模块想象成一个“工具箱”,里面放着特定功能的工具(函数、类等)。在别的程序里想用这些工具时,直接把整个工具箱“导入”进来就行,没必要自己从头造轮子。
一个.py文件(也就是模块)内部可以装不少东西:
比如一个叫math_utils.py的模块,里面可能长这样:
"""数学工具模块"""
PI = 3.14159
def add(a, b):
"""返回两数之和"""
return a + b
class Calculator:
def multiply(self, x, y):
return x * y
# 模块级别的可执行代码
print(f"模块 {__name__} 已被加载")
用模块是Python编程里公认的好习惯,好处一箩筐:
utils.parse()和config.parse()井水不犯河水。按来源分,Python模块主要有三大类:
这些是Python解释器自带的,装好就能直接用,不用额外安装。比如:
os:跟操作系统打交道。sys:跟Python解释器交互的变量和函数。math:数学运算。datetime:日期时间处理。import os print(os.getcwd()) # 打印当前工作目录
自己写的.py文件,项目里组织代码的基本单元。
其他开发者或组织贡献的,需要用包管理工具(比如pip)安装后才能用。例如:
requests:发HTTP请求。numpy:科学计算。pandas:数据分析。class.py、import.py)或内置模块名(比如sys.py)当名字,否则会覆盖它们。my_module.py、data_processor.py、utils.py。创建一个新的.py文件,就是在定义一个模块。把相关的代码(函数、类等)写进去就行。
示例:定义greetings.py模块
# greetings.py
"""一个简单的问候模块"""
def say_hello(name):
return f"Hello, {name}!"
def say_goodbye(name):
return f"Goodbye, {name}!"
# 测试代码:当模块直接运行时执行
if __name__ == "__main__":
print(say_hello("Developer"))
print(say_goodbye("World"))
利用if __name__ == "__main__":这个特殊判断。当模块被直接运行(比如python greetings.py)时,__name__变量的值是"__main__",里面的代码就会执行——很适合做模块的自我测试。而当模块被导入时,__name__是模块名,里面的代码不会执行,这样就避免了测试代码干扰主程序。
Python提供了好几种导入方式,适配不同场景。
导入整个模块,用的时候要加模块名前缀。
import greetings
message = greetings.say_hello("Alice")
print(message) # 输出: Hello, Alice!
从模块里只导入你需要的函数、变量或类,用的时候不用加模块前缀。
from greetings import say_hello
message = say_hello("Bob") # 直接使用函数名
print(message)
(不推荐)导入模块中所有不以_开头的名字。容易造成命名冲突,代码可读性也差。
from greetings import *
print(say_hello("Charlie"))
print(say_goodbye("Charlie"))
简化长模块名,或者避免命名冲突。
import numpy as np
from greetings import say_hello as hello
arr = np.array([1, 2, 3])
print(hello("Da vid"))
当用import语句时,Python解释器会按下面这个顺序,在指定路径里找模块文件(.py、.pyc等):
sys、builtins)。PYTHONPATH环境变量里列出的目录列表。lib等标准库目录。site-packages目录(通过pip安装的包放这里)。你可以通过sys.path查看当前的搜索路径列表:
import sys print(sys.path)
如果模块不在这些路径里,导入就会失败。可以临时修改sys.path添加路径,或者设置PYTHONPATH环境变量。
在模块里,__all__是一个特殊的列表变量,用来控制from module_name import *语句的行为。
from module_name import *时,只有列在__all__里的名字才会被导入。__all__ = ['function1', 'ClassA', 'variable1']。示例:
# my_tools.py
__all__ = ['public_func', 'PublicClass'] # 只有这两个会被 `import *` 导入
def public_func():
return "I am public"
def _private_func():
return "I am private"
class PublicClass:
pass
class _PrivateClass:
pass
# 另一个文件 from my_tools import * print(public_func()) # 可以访问 # print(_private_func()) # 错误!NameError,因为不在 __all__ 列表中
注意:__all__只影响import *,不影响显式导入(比如from my_tools import _private_func)。
项目一复杂,模块多了,就需要用包(Package)来组织模块。包是一个包含特殊文件__init__.py的目录,目录下可以放多个模块或子包。
my_package/
├── __init__.py
├── module_a.py
├── module_b.py
└── subpackage/
├── __init__.py
└── module_c.py
__init__.py文件的存在,让一个目录被Python视为包。这个文件可以是空的,但通常用来做这些事:
__all__:控制from package import *的行为。__init__.py里导入包内的关键模块或函数,这样用户可以直接从包名导入,不用深入模块路径。示例:my_package/__init__.py
# __init__.py
"""我的工具包"""
from .module_a import main_function # 相对导入
from .module_b import helper
__all__ = ['main_function', 'helper'] # 定义 from my_package import * 时可导入的内容
print("my_package 初始化完成")
这样一来,用户就可以直接写:from my_package import main_function。
包的导入语法跟模块类似,用点号.表示目录层级。
# 导入整个包(会执行 __init__.py) import my_package result = my_package.main_function() # 从包中导入特定模块 from my_package import module_a from my_package.module_a import specific_function # 从子包中导入 from my_package.subpackage import module_c
模块和包是Python模块化编程的基石。搞懂模块的分类、导入机制、搜索路径,以及__all__的用法,能帮你更好地组织代码。而掌握包的结构和__init__.py的用法,是搭建大型项目的前置条件。熟练使用pip和虚拟环境管理第三方依赖,更是现代Python开发的必备技能。从写一个简单的.py文件开始,逐步构建你的模块化项目吧!
上一篇:什么是PHP以及PHP的特性
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8