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

您的位置:首頁技術(shù)文章
文章詳情頁

淺談Python __init__.py的作用

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

我們經(jīng)常在python的模塊目錄中會(huì)看到 '__init__.py' 這個(gè)文件,那么它到底有什么作用呢?

1. 標(biāo)識(shí)該目錄是一個(gè)python的模塊包(module package)

如果你是使用python的相關(guān)IDE來進(jìn)行開發(fā),那么如果目錄中存在該文件,該目錄就會(huì)被識(shí)別為 module package 。

2. 簡化模塊導(dǎo)入操作

假設(shè)我們的模塊包的目錄結(jié)構(gòu)如下:

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

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

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

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

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

2.1 __init__.py 是怎么工作的?

實(shí)際上,如果目錄中包含了 __init__.py 時(shí),當(dāng)用 import 導(dǎo)入該目錄時(shí),會(huì)執(zhí)行 __init__.py 里面的代碼。

我們?cè)趍ypackage目錄下增加一個(gè) __init__.py 文件來做一個(gè)實(shí)驗(yàn):

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

mypackage/__init__.py 里面加一個(gè)print,如果執(zhí)行了該文件就會(huì)輸出:

print('You have imported mypackage')

下面直接用交互模式進(jìn)行 import

>>> import mypackageYou have imported mypackage

很顯然,__init__.py 在包被導(dǎo)入時(shí)會(huì)被執(zhí)行。

2.2 控制模塊導(dǎo)入

我們?cè)僮鲆粋€(gè)實(shí)驗(yàn),在 mypackage/__init__.py 添加以下語句:

from subpackage_1 import test11

我們導(dǎo)入 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’

報(bào)錯(cuò)了。。。怎么回事?

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

from mypackage.subpackage_1 import test11

綜上,我們可以在__init__.py 指定默認(rèn)需要導(dǎo)入的模塊

2.3 偷懶的導(dǎo)入方法

有時(shí)候我們?cè)谧鰧?dǎo)入時(shí)會(huì)偷懶,將包中的所有內(nèi)容導(dǎo)入

from mypackage import *

這是怎么實(shí)現(xiàn)的呢? __all__ 變量就是干這個(gè)工作的。

__all__ 關(guān)聯(lián)了一個(gè)模塊列表,當(dāng)執(zhí)行 from xx import * 時(shí),就會(huì)導(dǎo)入列表中的模塊。我們將 __init__.py 修改為 。

__all__ = [’subpackage_1’, ’subpackage_2’]

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

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

子目錄的中的模塊沒有導(dǎo)入!!!

該例子中的導(dǎo)入等價(jià)于

from mypackage import subpackage_1, subpackage_2

因此,導(dǎo)入操作會(huì)繼續(xù)查找 subpackage_1 和 subpackage_2 中的 __init__.py 并執(zhí)行。(但是此時(shí)不會(huì)執(zhí)行 import *)

我們?cè)?subpackage_1 下添加 __init__.py 文件:

__all__ = [’test11’, ’test12’]# 默認(rèn)只導(dǎo)入test11from mypackage.subpackage_1 import test11

再來導(dǎo)入試試

>>> 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’]

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

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

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

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

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

到此這篇關(guān)于淺談Python __init__.py的作用的文章就介紹到這了,更多相關(guān)Python __init__.py內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 国产精品爱久久久久久久9999 | 国产盗摄精品一区二区三区 | xxx免费视频 | 国产黄色片网站 | a级毛片免费看 | 免费精品99久久国产综合精品 | 国产亚洲一区二区三区 | 久9久9精品视频在线观看 | 久久在线综合 | 中文字幕日韩一区二区 | 成人中文字幕在线 | 亚洲国产一 | 久草在线网址 | 高跟丝袜美女一级毛片 | 99九九精品国产高清自在线 | 一区二区三区精品国产欧美 | 国产欧美久久久精品影院 | 日韩免费观看的一级毛片 | 成人网18免费软件 | 视频在线一区二区 | 欧美精品片在线观看网站 | 亚洲视频在线观看网址 | 一级aaaaaa毛片免费同男同女 | 中国黄色一级毛片 | 91视频啪啪 | 91年精品国产福利线观看久久 | 欧美成人短视频 | 国产成人黄网在线免 | 最新国产精品视频免费看 | 国产精品高清在线观看93 | 性盈盈影院影院 | 久久精品免费 | 亚洲天堂美女视频 | 99精品福利视频在线一区 | 国产成人精品免费视频大全办公室 | 高清性色生活片久久久 | 久久伊人精品热在75 | 亚洲毛片免费视频 | 97在线视频免费观看费观看 | 欧美做暖小视频xo免费 | 精品久久久久久久久久中文字幕 |