Python 包的制作(__init__.py)

Posted 荒唐了年少

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 包的制作(__init__.py)相关的知识,希望对你有一定的参考价值。

如何制作一个自己的
首先,需要创建一个文件夹,将其作为顶层包,在此文件夹内我们可以定义各个不同的子文
件夹与 .py 文件作为各个子包与模块
注意:在每个包文件夹下都需要有一个 __init__.py 文件,此文件可以为空
例如:我们创建一个文件夹Test作为顶层包文件夹,在Test内添加 __init__.py Top.py
[wangml@iZwz976helaylvgqok97prZ pythoncode]$ ls Test
__init__.py  __pycache__  Top.py
[wangml@iZwz976helaylvgqok97prZ Test]$ cat Top.py 
def top():
    print("Top!")
    return
接下来,我们创建一个在与 Test 在同一目录层次的 Test.py 文件,在它里面导入Test包
并引用Test包中包含的模块 Top 中的函数 top
[wangml@iZwz976helaylvgqok97prZ pythoncode]$ cat Test.py 
import Test
Test.Top.top()
执行Test.py这个文件,我们会看到什么呢?是输出 "Top!" 吗?
[wangml@iZwz976helaylvgqok97prZ pythoncode]$ python3 Test.py 
Traceback (most recent call last):
  File "Test.py", line 2, in <module>
    Test.Top.top()
AttributeError: module \'Test\' has no attribute \'Top\'
我们看到上面的输出结果,提示在 Test 中并没有找到模块 Top ,这是为什么呢?
问题出在 __init__.py 文件上,我么来看一下 __init__.py 文件
[wangml@iZwz976helaylvgqok97prZ Test]$ cat __init__.py

这是一个空文件。我们在前面说过,每个包文件内都需要包含一个 __init__.py 文件,只
有这样,这个文件夹才能被识别为一个Package,否则就仅仅是一个文件夹
而在上面的出错消息中我们看到,出错的在第二行, 证明 Test 这个包被成功导入了,但
第二行出了错,在 Test 内找不到 Top 这个模块。但我们已经将 Top.py 文件放在了Test
这个文件夹下的,为何会找不到呢?原因还是在 __init__.py  文件上。 虽然 Test 内有
__init__.py  文件,但仅仅这样,我们只能使 Test 被识别为一个Package, 而无法引用
内部的模块。我们需要在 __init__.py 文件中先导入 Top 模块,才能在外部导入 Test包
时使用这些模块,下面我们修改一下 __init__.py 文件,再执行Test.py看看结果:
[wangml@iZwz976helaylvgqok97prZ Test]$ vim __init__.py 
[wangml@iZwz976helaylvgqok97prZ Test]$ cat __init__.py 
from Test import Top
[wangml@iZwz976helaylvgqok97prZ Test]$ cd ../
[wangml@iZwz976helaylvgqok97prZ pythoncode]$ python3 Test.py 
Top!

和我们设想的一样,输出了 "Top!"

以上是关于Python 包的制作(__init__.py)的主要内容,如果未能解决你的问题,请参考以下文章

python基础:__init__.py和__init__函数的作用

最小示例 Python 模块导入的问题

包的介绍

[Python] 关于__init__.py

__init__.py文件的作用

python 通过文件夹导入包的操作