1. 程式人生 > >Python 包的制作(__init__.py)

Python 包的制作(__init__.py)

否則 TP tps 出了 包含 brush html 我們 rac

如何制作一個自己的包:
首先,需要創建一個文件夾,將其作為頂層包,在此文件夾內我們可以定義各個不同的子文
件夾與 .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)