这是我参与8月更文挑战的第17天,活动详情查看: 8月更文挑战
1. 包概述
当一个项目中有多个模块时,需要在进行组织。我们将功能类似的模块放到一起,形成了“包”。
本质上,包就是一个必须有一个__init__.py的文件夹
典型结构如下:
包下面可以包含模块(module),也可以再包含子包(subpackage).类似于像文件夹下面可以有文件,也可以有子文件夹一样。
如seleniumLibrary包文件下,仍然有一个__init__.py文件
⌛ 总结:包的特征是目录下必须要带__init__.py文件,可以包含多个子包和模块
2. 创建包
手动创建包(package) 主要由两步:
-
创建一个文件夹,该文件夹的名字就是包的包名
-
在该文件夹内添加一个__init__.py文件即可
Pycharm中创建包: 主要步骤:
- 选择要创建包的路径
- 单击右键:New->Python package
- Python会自动帮我们生成带有的__init__.py文件的包
例如,我们创建一个Juejin包,文件夹目录结构为
package Juejin
|
|---Juetime
| |---__init__.py
| |---module_time.py
|
|---__init__.py
|---module_hello.py
Juejin包子包模块module_time.py 模块内容如下
import time
name = "Juejin.module_time"
def currentdate():
return time.strftime("%y/%m/%d",time.localtime())
Juejin包模块module_hello.py内容如下:
name = "Juejin.module_hello"
def hello(name):
print("hello %s,welcome to juejin",name)
3. 导入包操作
导入包操作有常用形式有:
-
from package import itemitem 可以是包、模块,也可以是函数、类、变量
-
import item1,item2...item必须时包或者模块,不能是其他
✨导入包的本质:是导入了包的__init__.py文件
🎯**__init__.py的三个核心作用:**
- 作为包的标识,不能删除
- 用来实现模糊导入
- 导入包实质是执行__init__.py文件,可以在__init__.py文件中做这个包的初始化,以及需要统一执行代码。
📝举个栗子:package Juejin导入模块操作方式
-
使用import 导入module_time模块
import Juejin.Juetime.module_time📌 使用时,必须要添加完整名称来引用
Juejin.Juetime.module_time.currentdate() -
使用
from 包 import 模块来导入module_time模块from Juejin.Juetime import module_time📌 使用时,可以直接使用莫可名
module_time.currentdate() -
使用from...import直接导入函数
import Juejin.Juetime.module_time import currentdate📌使用时,直接使用函数名
currentdate()
4. 用*导入包
Python 也提供了import * 模糊导入文件系统找出包中所有的子模块并导入
🌟 但是会出现,程序找出包的过程会花费比较久的时间?
👉 Python可以解决方法是提供一个明确的包索引:在_init__.py定义位列表的__all__变量
__all__ = ["Module1", "Module2", "subPackage1", "subPackage2"]
✍ 继续以package Juejin导入模块操作方式
-
在Juejin包下__init__.py文件添加__all__变量
__all__ = ["module_hello","Juetime"] -
第三方调用
``` from Juejin import * module_hello.hello("Bob") ```
🌟 建议在正式项目中,尽量不使用import *方法
5. 包内引用
如果是子包内的引用,可以按相对位置引入子模块
-
同级目录导入
from . import 模块名 -
上级目录导入
from .. import 模块名
📢 使用包引用会时常遇到attempted relative import with no known parent package报错
原因是:父级包即上级目录的包的__name__ 等于 __main__和 package = None的时候导致的问题
解决办法:使用import 或者 from import来导入包
总结
本期,我们学习包提供 import 与 from...import语法帮助我们更好的导入模块。
比较上一期模块导入,包导入还提供了__init__.py文件定义__all__变量来导入包内所有的模块和子包。
以上是本期内容,欢迎大佬们点赞评论指正,下次见~ღ( ´・ᴗ・` )比心🌹🌹🌹🌹🌹✈️