Python3基础-包
一 包介绍
如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)
含有__init__.py文件的目录我们称之为包;文件内可以组织子模块或者子包
pythonscripts #顶级包
| -- __init__.py
|--lib #子包
| |--__init__.py
| |-- delete.py
| |--add.py
|---main.py #子模块
注意:
- python3 包没有__init__.py文件,import包仍然不会报错;
- python2 包没有__init__.py文件,import包会报错
- 创建包目的不是为了运行,还是被导入使用;
- 包A和包B下有同名模块也不会冲突,如A.a 和B,a来自两个明明空间
二 包导入
| -- __init__.py |--demo1 #子包 | |--demo1 | |--demo2 | |--demo3 | |---cal.py文件 |---main.py #子模块 #文件名:cal.py def add(x,y): return x+y
cal.py文件
def add_test(x,y): return x+y
main.py文件调用cal.py文件
#方法1 from demo1.demo2.demo3.cal import add_test print(add_test(1,5)) """ 执行结果 5 """ #方法2 from demo1.demo2.demo3 import cal print(cal.add_test(1,5)) """ 执行结果 6 """ # from demo1.demo2 import demo3 #执行web3 __init3__文件,唯一不支持的调用方式 # print(demo3.cal.add_test(1,5)) #报错AttributeError: module 'demo1.demo2.demo3' has no attribute 'cal'
=========================================================================================================================================================
web #顶级包 | -- __init__.py |--lib #子包 | |--__init__.py | |-- cal.py | |--request.py |---main.py #子模块 #包内各文件内容 #main.py def check(): print("我是main函数") #cal.py文件 def add(x,y): print("我是add的函数") return x+y #request.py def get(data): print("我是get请求函数") return data
#__init__.py文件内容均为空
1、绝对导入:以顶级包为起始
#test.py 文件和web 目录在相同的目录下 from web import main main.check() """ 执行结果 我是main函数 """
2、相对导入
在Lib目录下的__init__.py 文件写入
#Lib目录下的__init__.py from . import cal
#test.py 文件和web 目录在相同的目录下 from web import Lib print(Lib.cal.add(1,2)) """ 执行结果 我是add的函数 3 """