成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【python開發(fā)】1. __init__.py與導(dǎo)包

李義 / 3328人閱讀

摘要:原理根據(jù)的開發(fā)文檔,模塊導(dǎo)入主要有以下的步驟,創(chuàng)建一個(gè)新空的對象它可能包含多個(gè),把這個(gè)對象插入中,裝載的代碼如果需要,首先必須編譯,執(zhí)行新的中對應(yīng)的代碼。因此可以將初始化代碼放入該文件中。

@

python開發(fā)

開始拿著github上的python代碼狂啃時(shí),發(fā)現(xiàn)很多知道干嘛又不知道為啥這樣的代碼,開始瘋狂補(bǔ)漏。???

package 導(dǎo)包

用處1:導(dǎo)入包

比如這樣的架構(gòu):

  package1/    -- subPack1/       -- __init__.py       --  module_11.py       --  module_12.py       --  module_13.py    --subPack2/        --  __init__.py        --  module_21.py        --  module_22.py    ……

? 如果想在module_21.py中導(dǎo)入module_11.py的某一個(gè)class或者function時(shí),則需要subPack1中包含__init__.py,即使__init__.py是空的也可以,否則會報(bào)錯(cuò)找不到module。

2. 原理

根據(jù)python的開發(fā)文檔,模塊導(dǎo)入主要有以下的步驟:
1,創(chuàng)建一個(gè)新空的module對象(它可能包含多個(gè)module)
2,把這個(gè)module對象插入sys.module中
3,裝載module的代碼(如果需要,首先必須編譯)
4,執(zhí)行新的module中對應(yīng)的代碼。
在執(zhí)行第3步時(shí),首先要找到module程序所在位置,其查找順序如下

1.在當(dāng)前路徑以及當(dāng)前目錄指定的sys.path
2.從環(huán)境變量PYTHONPATH進(jìn)行查找
3.python的安裝設(shè)置相關(guān)的默認(rèn)路徑

? 如果當(dāng)前路徑或者PYTHONPATH存在與標(biāo)準(zhǔn)module相同的module,則會覆蓋標(biāo)準(zhǔn)module,也就是說,如果當(dāng)下目錄存在xml.py 那么執(zhí)行import xml.py時(shí),導(dǎo)入的當(dāng)前目錄下的module,而不是系統(tǒng)標(biāo)準(zhǔn)的xml。
? 那現(xiàn)在問題來了,怎么知道去哪兒找這些模塊呢,有的文件夾我想被搜索,有的文件夾不想被搜索,這里就需要__init__.py文件了,在文件夾下面有這個(gè)文件,則默認(rèn)該文件夾是個(gè)package,可以被搜索到。這是__init__.py的用處之一。

用處2:簡化包的導(dǎo)入

? 比如有個(gè)python文件依賴上面的所有文件:

from package1.subPack1 import module_11from package1.subPack1 import module_12from package1.subPack1 import module_21from package1.subPack2 import module_22from package1.subPack2 import module_23

?這個(gè)例子里面文件比較少,如果模塊比較大,目錄比較深的話,可能自己都記不清該如何導(dǎo)入。這種情況下,__init__.py 就很有作用了。我們先來看看該文件是如何工作的。
? 實(shí)際上,如果目錄中包含了 __init__.py 時(shí),當(dāng)用 import 導(dǎo)入該目錄時(shí),會優(yōu)先執(zhí)行 __init__.py 里面的代碼。

? 我們在package1目錄下增加一個(gè)__init__.py 文件:

  package1/    -- __init__.py    -- subPack1/       -- __init__.py       --  module_11.py       --  module_12.py       --  module_13.py    --subPack2/        --  _ _init__.py        --  module_21.py        --  module_22.py    ……

? 如果在__init__.py里面print一句話print("the package1 is loaded "),再在python下導(dǎo)入包

>>python>>import package1the package1 is loaded

控制模塊導(dǎo)入

這樣我們就可以在__init__.py里面導(dǎo)入需要文件包:
from package1.subPack1 import module_11
然后在python里面導(dǎo)入整個(gè)包:
import package1
如果要導(dǎo)入package1下面整個(gè)文件夾下面的包,則偷懶一點(diǎn):
from package1 import *
這里引出了另外一個(gè)問題,為啥* 能導(dǎo)入所有的模塊呢,這里涉及到一個(gè)變量__all__(這里后續(xù)補(bǔ)充)
綜上,在了解了 __init__.py 的工作原理后,應(yīng)該能理解該文件就是一個(gè)正常的python代碼文件?!∫虼丝梢詫⒊跏蓟a放入該文件中。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/125015.html

相關(guān)文章

  • python中的__init__.py文件和導(dǎo)包總結(jié)

    摘要:文件和導(dǎo)包總結(jié)也是一門學(xué)問導(dǎo)入方式的作用把某一個(gè)目錄變成一個(gè)包,使得其他模塊使用包包中的某一模塊函數(shù)變量類這種方式時(shí)可用什么時(shí)候有用如果某一個(gè)目錄在后期導(dǎo)入使用時(shí)只是作為中間目錄銜接使用,則可以不加,如果某個(gè)目錄后期會被直接或間接顯示地作為 python __init__.py文件和導(dǎo)包總結(jié) import也是一門學(xué)問~ 導(dǎo)入方式 import from xxx import y...

    CodeSheep 評論0 收藏0
  • 120 道 Python 面試筆試題匯總(上篇)

    摘要:所以在多線程中,線程的運(yùn)行仍是有先后順序的,并不是同時(shí)進(jìn)行。哈希函數(shù)的目的是使鍵均勻地分布在數(shù)組中。由于不同的鍵可能具有相同的哈希值,即可能出現(xiàn)沖突,高級的哈希函數(shù)能夠使沖突數(shù)目最小化。 首先這篇文章在我的《Python數(shù)據(jù)結(jié)構(gòu)》公眾號已經(jīng)提及,但是本篇文章提供了更為高級的解法,來發(fā)散大家的思維;同時(shí)為大家提供我的草稿py文件,大家可以關(guān)注《Python數(shù)據(jù)結(jié)構(gòu)》公眾號后恢復(fù) 120 ...

    susheng 評論0 收藏0
  • Flask Web 測試驅(qū)動開發(fā)最佳實(shí)踐之 Flask 實(shí)例

    摘要:當(dāng)功能越來越復(fù)雜的時(shí)候,你可能修改了一些東西,導(dǎo)致另外一個(gè)功能的不可用,而單元測試也能保證了原有功能被破壞后能被檢測出來。 showImg(https://segmentfault.com/img/remote/1460000017081749); 前言 前一篇講到了 TDD 測試驅(qū)動開發(fā)的相關(guān)概念和環(huán)境搭建,這篇就著手開始用TDD方式開發(fā)了。首先這篇需要編寫用戶相關(guān)的API接口,如...

    wuyangnju 評論0 收藏0
  • python初學(xué)——網(wǎng)絡(luò)編程之FTP服務(wù)器支持多并發(fā)版本

    摘要:擴(kuò)展支持多用戶并發(fā)訪問與線程池。項(xiàng)目請見初學(xué)網(wǎng)絡(luò)編程之服務(wù)器。不允許超過磁盤配額。該文件是一個(gè)使用模塊編寫的線程池類。這一步就做到了線程池的作用。 對MYFTP項(xiàng)目進(jìn)行升級。擴(kuò)展支持多用戶并發(fā)訪問與線程池。MYFTP項(xiàng)目請見python初學(xué)——網(wǎng)絡(luò)編程之FTP服務(wù)器。 擴(kuò)展需求 1.在之前開發(fā)的FTP基礎(chǔ)上,開發(fā)支持多并發(fā)的功能2.不能使用SocketServer模塊,必須自己實(shí)現(xiàn)多線...

    oysun 評論0 收藏0
  • django開發(fā)-django和tornado的不同

    摘要:中常用的幾個(gè)框架有等,今天來總結(jié)一下和的不同。本文使用的環(huán)境是。文件可以加載路由信息和項(xiàng)目配置信息,文件負(fù)責(zé)啟動項(xiàng)目。以上就簡單的比較了和幾個(gè)方面的不同,它們各有優(yōu)缺點(diǎn),實(shí)際工作中可以根據(jù)不同的需求選擇不同的框架進(jìn)行開發(fā)。 python中常用的幾個(gè)web框架有django, tornado, flask等,今天來總結(jié)一下django和tornado的不同。工作中django和torna...

    Reducto 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<