💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # `__init__.py` 如果创建一个包,要在这个包下面创建`__init__.py`文件 指定对外界提供的模块列表 在`__init__.py`中写入文件名 ~~~ __all__ = ["sendMsg", "recvMsg"] ~~~ 表示这个包下的这2个文件会被from 使用from 文件夹import 模块的方式导入 ![](https://box.kancloud.cn/2a56d1b5275255c5c884114725472dd7_470x176.png) 包将有联系的模块组织在一起,即放到同一个文件夹下,并且在这个文件夹创建一个名字为__init__.py文件,那么这个文件夹就称之为包 有效避免模块名称冲突问题,让应用组织结构更加清晰 上面是影响的`form xx import xx` 如果在`__init__.py`中写 ~~~ __all__ = ["sendMsg"] form . import sendMsg ~~~ 影响的是import 表示可以用文件夹名.文件名 `__init__.py`为空 仅仅是把这个包导入,不会导入包中的模块 总结: * `__all__`只能是from-import * `form . import sendMsg`这种是import # 编写内容 可以在这个文件中编写语句,当导入时,这些语句就会被执行 `__init__.py`文件 ![](https://box.kancloud.cn/ca6bc7b42f4b7d981d75fcce9fa3caef_534x153.png) ![](https://box.kancloud.cn/989723c25c424d018028699ca6e4f92d_766x284.png) # 嵌套的包 假定我们的包的例子有如下的目录结构: ~~~ Phone/ __init__.py common_util.py Voicedta/ __init__.py Pots.py Isdn.py Fax/ __init__.py G3.py Mobile/ __init__.py Analog.py igital.py Pager/ __init__.py Numeric.py ~~~ Phone 是最顶层的包,Voicedta 等是它的子包。我们可以这样导入子包: ~~~ import Phone.Mobile.Analog Phone.Mobile.Analog.dial() ~~~ 你也可使用`from-import` 实现不同需求的导入 第一种方法是只导入顶层的子包,然后使用属性/点操作符向下引用子包树: ~~~ from Phone import Mobile Mobile.Analog.dial('555-1212') ~~~ 此外,我们可以还引用更多的子包: ~~~ from Phone.Mobile import Analog Analog.dial('555-1212') ~~~ 事实上,你可以一直沿子包的树状结构导入: ~~~ from Phone.Mobile.Analog import dial dial('555-1212') ~~~ 在我们上边的目录结构中,我们可以发现很多的__init__.py文件。这些是初始化模块,from-import语句导入子包时需要用到它。如果没有用到,他们可以是空文件。 包同样支持from-import all 语句: ~~~ from package.module import * ~~~ 然而,这样的语句会导入哪些文件取决于操作系统的文件系统。所以我们在__init__.py中加入__all__变量。该变量包含执行这样的语句时应该导入的模块的名字。它由一个模块名字符串列表组成.。