当前位置: 首页 > ds >正文

Python包、模块、类的导入语法与机制解析

1、核心概念:包、模块、类

在理解导入语法前,需要先明确几个核心概念:

概念定义示例
包含多个模块的目录,需通过 __init__.py 文件声明(Python 3.3+ 可选)。目录 mypackage 下有 submodule1.pysubmodule2.py,且含 __init__.py
模块单个 .py 文件,包含函数、类、变量等代码,用于实现特定功能。math.py(标准库模块)、my_module.py(自定义模块)
模块或包中的代码结构,用于封装数据和方法。datetime 模块中的 datetime 类(from datetime import datetime

2、导入的常见语法

导入(Import) 是将其他模块/包中的代码对象(类、函数、变量等)加载到当前代码的命名空间中,使其可以被直接调用。

Python 的导入语法是from...import...从“源”中导入“目标对象”

  • from 用于指定“源”,模块或包(可选,无 from 时直接导入模块/包);
  • import 用于指定“目标对象”,模块、子包、类、函数、变量等(必须,是导入操作的核心)。

2.1、直接导入模块或包(无 from

语法import source
说明source 可以是模块(.py 文件)包(目录),将整个源加载到当前命名空间,访问时需通过 源名.对象名

示例

# 导入模块(如标准库 math)
import math
print(math.pi)  # 访问模块内的变量# 导入包(如自定义包 mypackage)
import mypackage  # 需确保 mypackage 所在目录在 sys.path 中
mypackage.module_a.func_a()  # 访问包内子模块的函数(需 mypackage/__init__.py 暴露模块)

2.2、导入时重命名(模块/包均可)

语法import source as alias
说明:为模块或包起别名,简化后续调用(尤其适合名称过长或避免命名冲突)。

示例

# 模块重命名(科学计算常用)
import numpy as np  # 用 np 代替 numpy
arr = np.array([1, 2, 3])# 包重命名(自定义包)
import mypackage as mp  # 用 mp 代替 mypackage
mp.module_a.func_a()  # 调用包内子模块的函数

2.3、从源(模块/包)中导入特定对象

语法from source import target
说明source 是模块或包(支持层级路径),target 是源中的对象(类、函数、变量、子模块、子包等)。

示例

# 从模块中导入类(最常见场景)
from datetime import datetime  # source=模块 datetime,target=类 datetime
now = datetime.now()# 从包中导入子模块(自定义包场景)
from mypackage import module_a  # source=包 mypackage,target=子模块 module_a
module_a.func_a()  # 直接使用子模块的函数# 从子包中导入模块(层级路径)
from mypackage.subpackage import module_b  # source=子包 mypackage.subpackage,target=模块 module_b
module_b.ClassB().method()  # 使用子包模块中的类

2.4、从源中导入多个对象(模块/包均可)

语法from source import target1, target2, ...
说明:同时导入源中的多个对象(类型可混合:类、函数、子模块等)。

示例

# 从模块中导入多个函数/变量
from math import pi, sqrt  # 导入变量 pi 和函数 sqrt
print(pi)
print(sqrt(25))# 从包中导入多个子模块
from mypackage import module_a, subpackage  # 导入子模块 module_a 和子包 subpackage
module_a.func_a()
subpackage.module_b.func_b()  # 调用子包模块的函数

2.5、从源中导入所有对象(不推荐)

语法from source import *
说明:导入源中所有非下划线开头的对象(类、函数、变量、子模块等),但强烈不推荐(易导致命名冲突,代码可读性差)。

示例

# 从模块导入所有对象(如 math)
from math import *  # 导入 pi、sqrt、sin 等所有对象
print(pi)
print(sin(0))# 从包导入所有对象(需包的 __init__.py 定义 __all__ 控制导出)
from mypackage import *  # 导入 mypackage 中 __all__ 声明的子模块/对象
module_a.func_a()  # 若 __all__ 包含 module_a 则可用

3、导入的机制

3.1、导入的优先级(从高到低)

  • 内置模块
    • 存储位置:C 语言实现,集成在 Python 解释器内存中(无物理文件)。
    • 加载时机:Python 启动时自动加载,优先于所有磁盘路径。
  • 当前目录
    • 存储位置:脚本所在目录(或交互式环境的终端工作目录)。
    • 作用时机:本地自定义模块(如 my_module.py)的优先搜索路径。
  • 环境变量PYTHONPATH
    • 存储位置:用户通过环境变量自定义的额外搜索目录(如 export PYTHONPATH=/my/lib)。
    • 加载时机:Python 启动时自动读取,路径按顺序添加到 sys.path 中。
  • 标准库目录
    • 存储位置:Python 安装路径下的 lib 目录(如 /usr/lib/python3.12)。
    • 内容时机:包含标准库的 .py 文件、.pyc 预编译文件及 C 扩展(.so/.pyd)。

3.2、sys.path

sys.path 是 Python 运行时的一个内置列表,用于存储模块搜索的路径。
除了上面提到的“内置模块”以外,其他的加载路径都保存在这里。

进入python解释器后,通过以下命令就能查看sys.path的具体内容:

import sys
print(sys.path)

在这里插入图片描述
'',代表当前目录(脚本所在目录或终端工作目录)

没有额外配置环境变量PYTHONPATH,所以接下来是到了系统级的标准库,首先是.zip压缩文件,这是用来提高加载速度的。

然后是/usr/lib/python3.12,标准库的未压缩目录版本(与 .zip 内容重复,备用路径),如下图。
在这里插入图片描述

/usr/lib/python3.12/lib-dynload是动态加载的 C 扩展模块,一些列的.so文件。
在这里插入图片描述

/home/ly/web_pyvenv/lib/python3.12/site-packages
虚拟环境隔离的第三方包目录(如 numpy、pandas 等用户安装的库)。
在这里插入图片描述

http://www.xdnf.cn/news/6600.html

相关文章:

  • 解码生命语言:深度学习模型TranslationAI揭示RNA翻译新规则
  • 什么是模态内异质性,什么是模态间异质性?
  • zabbix7.2 zabbix-agent自动注册 被动模式(五)
  • SpringBoot基础(静态资源导入)
  • 观测云产品更新 | 安全监测、事件中心、仪表板AI智能分析等
  • 数据结构与算法--顺序表--单链表
  • python可视化:北方省市GDP与人口变化关系分析4
  • C++二项式定理:原理、实现与应用
  • Rust 数据结构:Vector
  • 学习笔记:黑马程序员JavaWeb开发教程(2025.4.5)
  • FEKO许可证激活错误解决方法
  • 【Ansible基础】Ansible 核心组件深度解析:控制节点、受管节点、Inventory与Playbook
  • 建筑迈向绿色发展之路,楼宇自控成建筑可持续发展关键技术
  • 考研408《计算机组成原理》复习笔记,第二章(2)数值数据的表示和运算(浮点数篇)
  • 2025年大厂C++面试题总结与解析
  • 如何在Windows右键新建菜单中添加自定义项,将notepad添加到新建菜单
  • 黑马程序员C++2024版笔记 第0章 C++入门
  • Web安全科普:构建数字世界的“防盗门”
  • 贪吃蛇游戏消息通知功能开发全解析
  • 变分自编码器(Variational Autoencoder, VAE)
  • GDB的使用
  • TCSVT投稿记录
  • JAVA学习-练习试用Java实现“语音识别的基础 :如使用MFCC特征提取和简单的分类器”
  • Python 类变量与实例变量完全指南:区别、使用场景及常见陷阱
  • Vue 3中ref
  • 实验6 电子邮件
  • 【Java学习笔记】【第一阶段项目实践】零钱通(面向过程版本)
  • Vue3学习(组合式API——生命周期函数基础)
  • 分类预测 | Matlab实现ABC-Transformer人工蜂群算法优化编码器多特征分类预测/故障诊断Matlab实现
  • 抢购Python代码示例与技术解析