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

淺談Python __init__.py的作用

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

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

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

如果你是使用python的相關IDE來進行開發(fā),那么如果目錄中存在該文件,該目錄就會被識別為 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 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

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

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

2.1 __init__.py 是怎么工作的?

實際上,如果目錄中包含了 __init__.py 時,當用 import 導入該目錄時,會執(zhí)行 __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,如果執(zhí)行了該文件就會輸出:

print("You have imported mypackage")

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

>>> import mypackage
You have imported mypackage

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

2.2  控制模塊導入

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

from subpackage_1 import test11

我們導入 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'

報錯了。。。怎么回事?

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

from mypackage.subpackage_1 import test11

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

2.3  偷懶的導入方法

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

from mypackage import *

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

__all__ 關聯(lián)了一個模塊列表,當執(zhí)行 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

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

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

__all__ = ['test11', 'test12']

# 默認只導入test11
from 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內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python里disconnect UDP套接字的方法

    Python里disconnect UDP套接字的方法

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

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

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

    Python用Pillow(PIL)進行簡單的圖像操作方法

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

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

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

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

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

    python加密打包程序詳解

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

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

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

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

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

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

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

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

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

最新評論

金溪县| 台山市| 本溪市| 普兰店市| 泽普县| 彝良县| 灌云县| 武鸣县| 长兴县| 南阳市| 利川市| 县级市| 贵州省| 福泉市| 徐水县| 青龙| 顺昌县| 灵宝市| 乌鲁木齐县| 周宁县| 石首市| 阳春市| 马关县| 宾川县| 岢岚县| 甘肃省| 麻江县| 新巴尔虎右旗| 岐山县| 介休市| 砚山县| 阳信县| 陆良县| 永康市| 陈巴尔虎旗| 山东| 广南县| 湛江市| 宁海县| 留坝县| 噶尔县|