Python模块与包详解

        前言

1、模块(Module)

1.1、定义

1.2、分类

1.3、创建模块

1.4、导入模块

1.5、模块的 __name__ 属性

 2、包(Package)

2.1、包的结构

2.2、包的导入方式

2.3、相对导入(包内部使用)

3、相关函数与工具

1、importlib.reload() 

 2、__import__()

3、sys.path

4、详细示例

示例1:模块与包的创建

示例2:处理导入问题

5、关键注意事项

6、常见错误

前言

最近在学习Python,将所学内容整理成文章,以便以后翻阅和复习,同时分享给大家。有问题欢迎随时指正。

1、模块(Module)

1.1、定义

一个.py文件即为一个模块,是Python代码的最小组织单位。 

1.2、分类

  • 标准库模块:如os、sys、math等。
  • 自定义模块:用户自己编写的.py文件。
  • 作用:提高代码复用性,避免命名冲突,增强可维护性。

1.3、创建模块

创建一个名为 math_tools.py 的模块:

# math_tools.py
def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

PI = 3.14159

if __name__ == "__main__":
    print("模块测试:", add(5, 3))

1.4、导入模块

  •  基本语法
import module_name          # 导入整个模块
from module_name import func # 导入特定函数
import module_name as alias # 设置别名
  •  导入模块的方式:
# 方式1:导入整个模块
import math_tools
print(math_tools.add(2, 3))  # 5

# 方式2:导入特定内容
from math_tools import subtract
print(subtract(5, 2))  # 3

# 方式3:别名导入
import math_tools as mt
print(mt.PI)  # 3.14159

# 方式4:导入所有内容(不推荐)
from math_tools import *
print(add(10, 20))

1.5、模块的 __name__ 属性

  • 当模块被直接运行时,__name__ 为 "__main__"

  • 当模块被导入时,__name__ 为模块名。

# 直接运行模块时执行测试代码
if __name__ == "__main__":
    print("模块测试通过")

 2、包(Package)

是一个包含多个模块的目录,必须包含一个__init__.py文件(可以是空文件),用于标识当前目录是一个包。

2.1、包的结构

my_package/
├── __init__.py
├── module1.py
└── subpackage/
    ├── __init__.py
    └── module2.py

2.2、包的导入方式

# 导入包中的模块
from my_package import module1
module1.func()

# 导入子包中的模块
from my_package.subpackage import module2
module2.func()

# 在 __init__.py 中预先导入(可选)
# my_package/__init__.py
from .module1 import func

2.3、相对导入(包内部使用)

在包内部的模块中,可以使用相对路径导入其他模块:

# module2.py(位于subpackage中)
from ..module1 import func  # 从上级目录导入

3、相关函数与工具

1、importlib.reload() 

重新加载模块(适用于调试):

import importlib
importlib.reload(math_tools)

 2、__import__()

动态导入模块(较少使用):

module_name = "math_tools"
math_tools = __import__(module_name)

3、sys.path

查看模块搜索路径或添加自定义路径:

import sys
sys.path.append("/path/to/module_directory")

4、详细示例

示例1:模块与包的创建

1、创建包 my_package: 

my_package/
├── __init__.py
├── utils.py
└── algorithms/
    ├── __init__.py
    └── sort.py

2、编写模块 utils.py

# utils.py
def greet(name):
    return f"Hello, {name}!"

3、在外部使用包:

from my_package.utils import greet
from my_package.algorithms.sort import bubble_sort

print(greet("Alice"))  # Hello, Alice!
print(bubble_sort([3, 1, 2]))  # [1, 2, 3]

示例2:处理导入问题

1、路径问题:模块不在当前目录时,手动添加路径: 

import sys
sys.path.append("/path/to/my_package")

2、循环导入:避免模块A导入模块B,同时模块B导入模块A。

解决方法:将导入语句移到函数内部或重构代码。

5、关键注意事项

  1. __init__.py 的作用

    • 标识目录为包。

    • 定义 __all__ 变量(如 __all__ = ["module1"])控制 from package import * 的行为。

    • 执行包级别的初始化代码。

  2. 绝对导入 vs 相对导入

    • 绝对导入:from my_package.module import func

    • 相对导入:from .submodule import func(仅限包内部)

  3. 模块缓存:Python会缓存导入的模块(sys.modules),重复导入时直接使用缓存。

6、常见错误

  1. ModuleNotFoundError:检查路径或包结构。

  2. ImportError:确认导入语句是否正确,避免循环导入。

  3. AttributeError:确保模块中存在被导入的属性。

你可能感兴趣的:(Python,python,开发语言)