包
包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的 Python 的应用环境。
简单来说,包就是文件夹,但该文件夹下必须存在 __init__.py 文件, 该文件的内容可以为空。__init__.py 用于标识当前文件夹是一个包
1、包中的__init__.py
__init__.py控制着包的导入行为
创建包后,包里自动生成一个__init__.py在python3中没有意义,删掉也没问题
在python2 中是有作用的,若在python2中不定义一个__init__.py会导致其他模块不能使用该包中的模块
1.1、可以在__init__.py文件里添加内容,当导入此包中的模块时,__init__.py文件代码就会执行
1.2、若包里没有__init__.py文件,则其他模块导入此包(说的是只导入包,不是模块,即在其他包的模块文件中只导入包名(不导模块名也可以使用模块))时:
python2导入失败;python3可以成功导入,但是使用包中模块时会报错
接下来可以在包里创建一个__init__.py文件,创建后:python2导入成功,但模块不能使用;python3可以成功导入,但模块不能使用(__init__.py在python3中没有意义,删掉也没问题)
第三步,若要使用包中的模块,python2中需要在__init__.py文件里写入导入的模块名:import 模块名;python3中用python2的方式不能解决问题,需要这样:from . import 模块名(.点表示的是当前路径)
2、使用包里的模块
包里的模块导入:import 包名.模块名 as 别名
包名:package_test,包里文件:__init__.py(空) 、test_1.py
test_1.py内容
def func(): print('测试包 test_1')
在另外的包有个test.py模块,在此模块调用package_test/test_1.py
import package_test.test_1 as test test.func() ============================================== 运行结果: 测试包 test_1
3、__all__
在__init__.py
文件中,定义一个__all__
变量,它控制着 from 包名 import *时导入的模块
__all__也属于模块中的变量,如果一个模块用了__all__ = ['变量1','变量2'.....],且另外一个模块导入该模块的方式是:from 包名 import *
那么只有在__all__的列表中的字符串(变量)才可以在其他模块使用
例:
test.py
# 条件 其他模块必须是通过from 模块名 import * 方式导入的模块 __all__ = ["name",'add2num'] name = "加法运算" def add2num(a, b): return a + b def delnum(a,b): return a - b
ceshi.py
from test import * # 可以正常调用 print(name) print(add2num(33,8)) # 调用delnum函数失败 f = delnum(33,2) print(f)
======================================
报错信息:NameError: name 'test' is not defined