国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

淺談Python __init__.py的作用

瀏覽:73日期:2022-07-06 18:41:30

我們經常在python的模塊目錄中會看到 '__init__.py' 這個文件,那么它到底有什么作用呢?

1. 標識該目錄是一個python的模塊包(module package)

如果你是使用python的相關IDE來進行開發,那么如果目錄中存在該文件,該目錄就會被識別為 module package 。

2. 簡化模塊導入操作

假設我們的模塊包的目錄結構如下:

.└── mypackage ├── subpackage_1 │ ├── test11.py │ └── test12.py ├── subpackage_2 │ ├── test21.py │ └── test22.py └── subpackage_3 ├── test31.py └── test32.py

如果我們使用最直接的導入方式,將整個文件拷貝到工程目錄下,然后直接導入:

from mypackage.subpackage_1 import test11from mypackage.subpackage_1 import test12from mypackage.subpackage_2 import test21from mypackage.subpackage_2 import test22from mypackage.subpackage_3 import test31from mypackage.subpackage_3 import test32

當然這個例子里面文件比較少,如果模塊比較大,目錄比較深的話,可能自己都記不清該如何導入。(很有可能,哪怕只想導入一個模塊都要在目錄中找很久)

這種情況下,__init__.py 就很有作用了。我們先來看看該文件是如何工作的。

2.1 __init__.py 是怎么工作的?

實際上,如果目錄中包含了 __init__.py 時,當用 import 導入該目錄時,會執行 __init__.py 里面的代碼。

我們在mypackage目錄下增加一個 __init__.py 文件來做一個實驗:

.└── mypackage ├── __init__.py ├── subpackage_1 │ ├── test11.py │ └── test12.py ├── subpackage_2 │ ├── test21.py │ └── test22.py └── subpackage_3 ├── test31.py └── test32.py

mypackage/__init__.py 里面加一個print,如果執行了該文件就會輸出:

print('You have imported mypackage')

下面直接用交互模式進行 import

>>> import mypackageYou have imported mypackage

很顯然,__init__.py 在包被導入時會被執行。

2.2 控制模塊導入

我們再做一個實驗,在 mypackage/__init__.py 添加以下語句:

from subpackage_1 import test11

我們導入 mypackage 試試:

>>> import mypackageTraceback (most recent call last): File '<stdin>', line 1, in <module> File '/home/taopeng/Workspace/Test/mypackage/__init__.py', line 2, in <module> from subpackage_1 import test11ImportError: No module named ’subpackage_1’

報錯了。。。怎么回事?

原來,在我們執行import時,當前目錄是不會變的(就算是執行子目錄的文件),還是需要完整的包名。

from mypackage.subpackage_1 import test11

綜上,我們可以在__init__.py 指定默認需要導入的模塊

2.3 偷懶的導入方法

有時候我們在做導入時會偷懶,將包中的所有內容導入

from mypackage import *

這是怎么實現的呢? __all__ 變量就是干這個工作的。

__all__ 關聯了一個模塊列表,當執行 from xx import * 時,就會導入列表中的模塊。我們將 __init__.py 修改為 。

__all__ = [’subpackage_1’, ’subpackage_2’]

這里沒有包含 subpackage_3,是為了證明 __all__ 起作用了,而不是導入了所有子目錄。

>>> from mypackage import *>>> dir()[’__builtins__’, ’__doc__’, ’__loader__’, ’__name__’, ’__package__’, ’__spec__’, ’subpackage_1’, ’subpackage_2’]>>> >>> dir(subpackage_1)[’__doc__’, ’__loader__’, ’__name__’, ’__package__’, ’__path__’, ’__spec__’]

子目錄的中的模塊沒有導入!!!

該例子中的導入等價于

from mypackage import subpackage_1, subpackage_2

因此,導入操作會繼續查找 subpackage_1 和 subpackage_2 中的 __init__.py 并執行。(但是此時不會執行 import *)

我們在 subpackage_1 下添加 __init__.py 文件:

__all__ = [’test11’, ’test12’]# 默認只導入test11from mypackage.subpackage_1 import test11

再來導入試試

>>> from mypackage import *>>> dir()[’__builtins__’, ’__doc__’, ’__loader__’, ’__name__’, ’__package__’, ’__spec__’, ’subpackage_1’, ’subpackage_2’]>>> >>> dir(subpackage_1)[’__all__’, ’__builtins__’, ’__cached__’, ’__doc__’, ’__file__’, ’__loader__’, ’__name__’, ’__package__’, ’__path__’, ’__spec__’, ’test11’]

如果想要導入子包的所有模塊,則需要更精確指定。

>>> from mypackage.subpackage_1 import *>>> dir()[’__builtins__’, ’__doc__’, ’__loader__’, ’__name__’, ’__package__’, ’__spec__’, ’test11’, ’test12’]

3. 配置模塊的初始化操作

在了解了 __init__.py 的工作原理后,應該能理解該文件就是一個正常的python代碼文件。

因此可以將初始化代碼放入該文件中。

到此這篇關于淺談Python __init__.py的作用的文章就介紹到這了,更多相關Python __init__.py內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 国产精品久久久一区二区三区 | 亚洲天堂网在线观看视频 | 99精品福利视频在线一区 | 一级女性全黄久久生活片 | 女人张开腿男人猛桶视频 | 精品玖玖玖视频在线观看 | 全国最大色成免费网站 | 国产欧美日韩在线 | 黄色三级三级三级 | 日韩色视频一区二区三区亚洲 | 成人免费一级在线播放 | 国产欧美17694免费观看视频 | 久久午夜影视 | 亚洲欧美另类色妞网站 | 玖玖精品在线观看 | 国产视频综合 | 亚洲欧美午夜 | 日本免费久久 | 欧美日韩顶级毛片www免费看 | 欧美丰满大乳大屁股毛片 | 特级毛片永久久免费观看 | 欧美国产成人一区二区三区 | 日本一级毛片高清免费观看视频 | 久9青青cao精品视频在线 | 最新国产三级久久 | 亚洲人成亚洲人成在线观看 | 亚洲国产欧美在线人成aaa | 一级毛片播放 | 午夜精品在线 | 免费永久观看美女视频网站网址 | 亚洲国产日韩成人综合天堂 | 久久久久免费观看 | 国产欧美在线观看 | 多人伦精品一区二区三区视频 | 91香蕉国产观看免费人人 | 狠狠色丁香九九婷婷综合五月 | 国产精品久久一区一区 | 亚洲一区免费观看 | 亚洲国产成a人v在线观看 | chinese情侣真实自拍 | 成人日韩在线观看 |