最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Python __init__.py的作用

 更新時(shí)間:2020年10月28日 14:23:30   作者:TpCode  
這篇文章主要介紹了淺談Python __init__.py的作用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

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

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

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

2. 簡(jiǎn)化模塊導(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 test11
from mypackage.subpackage_1 import test12
from mypackage.subpackage_2 import test21
from mypackage.subpackage_2 import test22
from mypackage.subpackage_3 import test31
from mypackage.subpackage_3 import test32

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

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

2.1 __init__.py 是怎么工作的?

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

我們?cè)趍ypackage目錄下增加一個(gè) __init__.py 文件來(lái)做一個(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 mypackage
You have imported mypackage

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

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

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

from subpackage_1 import test11

我們導(dǎo)入 mypackage 試試:

>>> import mypackage
Traceback (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 test11
ImportError: No module named 'subpackage_1'

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

原來(lái),在我們執(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']

這里沒(méi)有包含 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__']

子目錄的中的模塊沒(méi)有導(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)入test11
from mypackage.subpackage_1 import test11

再來(lái)導(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)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python里disconnect UDP套接字的方法

    Python里disconnect UDP套接字的方法

    這篇文章主要介紹了Python里disconnect UDP套接字的方法,本文使用的是ctypes繞過(guò)的方法,需要的朋友可以參考下
    2015-04-04
  • Matlab、Python為工具解析數(shù)據(jù)可視化之美

    Matlab、Python為工具解析數(shù)據(jù)可視化之美

    下面介紹一些數(shù)據(jù)可視化的作品(包含部分代碼),主要是地學(xué)領(lǐng)域,可遷移至其他學(xué)科,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-11-11
  • Python用Pillow(PIL)進(jìn)行簡(jiǎn)單的圖像操作方法

    Python用Pillow(PIL)進(jìn)行簡(jiǎn)單的圖像操作方法

    下面小編就為大家?guī)?lái)一篇Python用Pillow(PIL)進(jìn)行簡(jiǎn)單的圖像操作方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • 使用python如何提取JSON數(shù)據(jù)指定內(nèi)容

    使用python如何提取JSON數(shù)據(jù)指定內(nèi)容

    這篇文章主要介紹了使用python如何提取JSON數(shù)據(jù)指定內(nèi)容,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 詳解Python排序算法的實(shí)現(xiàn)(冒泡,選擇,插入,快速)

    詳解Python排序算法的實(shí)現(xiàn)(冒泡,選擇,插入,快速)

    這篇文章主要為大家介紹了Python中常見(jiàn)的四種排序算法的實(shí)現(xiàn):冒泡排序、選擇排序、插入排序和快速排序,文中通過(guò)圖片詳細(xì)講解了它們實(shí)現(xiàn)的原理與代碼,需要的可以參考一下
    2022-04-04
  • python加密打包程序詳解

    python加密打包程序詳解

    這篇文章主要介紹了python加密打包程序,還給大家介紹了Python實(shí)現(xiàn)文件簡(jiǎn)單加解密的方法,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • python定時(shí)執(zhí)行指定函數(shù)的方法

    python定時(shí)執(zhí)行指定函數(shù)的方法

    這篇文章主要介紹了python定時(shí)執(zhí)行指定函數(shù)的方法,涉及Python中sleep方法延時(shí)執(zhí)行的相關(guān)使用技巧,需要的朋友可以參考下
    2015-05-05
  • 在Python程序中實(shí)現(xiàn)分布式進(jìn)程的教程

    在Python程序中實(shí)現(xiàn)分布式進(jìn)程的教程

    這篇文章主要介紹了在Python程序中實(shí)現(xiàn)分布式進(jìn)程的教程,在多進(jìn)程編程中十分有用,示例代碼基于Python2.x版本,需要的朋友可以參考下
    2015-04-04
  • Python Pandas 箱線圖的實(shí)現(xiàn)

    Python Pandas 箱線圖的實(shí)現(xiàn)

    這篇文章主要介紹了Python Pandas 箱線圖的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • python 平衡二叉樹(shù)實(shí)現(xiàn)代碼示例

    python 平衡二叉樹(shù)實(shí)現(xiàn)代碼示例

    這篇文章主要介紹了python 平衡二叉樹(shù)實(shí)現(xiàn)代碼示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07

最新評(píng)論

武隆县| 准格尔旗| 永丰县| 普洱| 梁平县| 昭通市| 安新县| 青浦区| 丹阳市| 将乐县| 尼勒克县| 唐海县| 五指山市| 哈巴河县| 中江县| 金阳县| 寿光市| 汉中市| 安岳县| 无为县| 浙江省| 清远市| 崇义县| 腾冲县| 托里县| 普洱| 疏附县| 常州市| 当涂县| 江西省| 兴仁县| 岳池县| 定边县| 股票| 黄石市| 措美县| 偏关县| 珲春市| 衡山县| 高碑店市| 西藏|