python包和模块

本文深入讲解了Python中模块和包的概念,包括它们的创建、作用、分类及导入方式。探讨了如何通过模块和包实现代码的封装、组织与管理,避免命名冲突,提升代码质量和维护性。

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

概念

模块:将一组相关功能的代码写入一个单独的.py文件中,.py文件被称作是一个模块
包:一个有层次的文件目录结构,定义了n个模块和子包,包含__init__.py文件的目录
库:可以是一个模块也可以是一个包
框架:通过框架可以快速实现一个解决问题的骨架,到时候按照框架的角色去填充,交互就可以完成一个质量好、维护性高的项目。例如文本框架(Flask、Django…)

包和模块的作用

封装一些轮子工具代码供其他模块使用、有效的对程序进行分解、方便代码的管理和维护
可以防止同一模块内命名重复问题

分类

标准包/模块:python可以导入的自带的 内建模块(import buildin)不需要导入(print、int、float…) 其他的需要导入 import os
三方包/模块:下载安装
自定义包/模块:自己写好的的,发出去就变成了三方模块

包和模块的创建

# 包和模块的创建
# 创建模块直接创建一个.py文件即可
# 创建包:创建一个文件夹,文件夹内必须有一个__init__.py文件(导入包会自动执行这个py)
# 创建多层级包:在包里面直接创建另外一个包即可

在这里插入图片描述
包和模块的基本信息

# 包和模块基本信息
# 模块名称就是.py前面的,包的名称就是文件夹名称
# 查看标准包和模块的位置
import os
print(os.__file__)
print(dir(os)) # C:\Users\杨柳\AppData\Local\Programs\Python\Python35\lib\os.py

import json
print(dir(json))
print(json.__file__)

导入包和模块的方式

# 导入包和模块的方式
# 常规导入:import M (导入单个模块) import M as 别名
# 导入多个包 import M1,M2
# 导入某个包 会自动执行__init__.py
import os, Bao.Tool
print(Bao.Tool.num) # 执行了导入包Bao模块的init 100

# 导入包的时候同时起名
import Bao.Tool as t
print(t.num) # 100

# 常规导入使用需要指明资源的模块名称:Bao.module.run()
# 如果导入的是一个包,默认不会导入任何模块
# 解决方案:
# 1、导入包自动导入包里面所有模块,让Bao包下面的init里面导入包下面所有模块

print("执行了导入包Bao模块的init")
import Bao.Tool
import Bao.Test

# 2、from ...import...的形式导入
# 导入一个模块或者包中的某个部分
# 注意面向关系:包里面只能看到模块、模块里面只能看到模块的资源
from Bao import Tool as T, Tool2 as T2
print(T.num)
print(T2.num)
from Bao.BBao import Tool3 as T3
print(T3.num)

from Bao.Tool import num1
print(num1)  # 从某个模块里面导入num1资源

# 特例:from 模块 import *、from 包 import * 批量导入资源
# __all__ = [""]会导入模块all列表里面所有资源
# 在包下面的init.py里面写上__all__ = [""]要导入的模块
__all__ = ["Tool", "Tool2", "Test"]  # 列表里面都是字符串
# 慎用,因为你无法预知到时你会导入哪些内容到当前位置,容易产生变量名冲突
from Bao.Tool import *
print(num)
print(num1)
from Bao import *
print(Tool.num)

导入模块具体做了什么事

# 导入模块具体做了什么事:
# 第一次导入时:
# 	1、在自己当下的命名空间中,执行所有的代码
# 	2、创建一个模块对象,并将模块内所有顶级变量以属性的形式绑定在对象上
import Bao.Tool as t
print(t.num)
print("dsf",t.__dict__) # t是对象
# 	3、在import的位置,引入import后面的变量名称到当前命名空间
# 第二次导入的时候:直接执行上述第三步
# 结论:
# 	1、多次导入模块,该模块不会执行多次
#   2、两种方式不存在哪一种节省内存,import和from区别在于把哪一个部分拿到当前位置来用 所有对象都创建好了

模块检索路径

从那个位置找到需要导入的模块

# 模块检索路径-内置和sys.path
# 第一次导入:按照模块检索路径顺序去找,优先第一级:内置模块、第二级:sys.path(路径列表里面逐个去找)、追加路径方式
# sys.path构成:当前目录、环境变量PYTHONPATH中所指定的路径列表、特定路径下面的.pth文件中的文件路径列表、python安装路径的lib库中搜索
# 追加路径方式:
#	1、直接修改sys.path 仅作用本次
#   2、修改环境变量:PYTHONPATH,仅仅在shell中有效,pycharm需要另外一种设置方式
#   3、添加.path文件
# 第二次导入:从已经加载过的模块中去找、查看已加载模块
# 查看已加载模块
import sys
print(sys.modules)

导入模块的常见场景

局部导入、覆盖导入、循环导入、可选导入、包内导入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值