摘要:比如,模塊名表示包中名為的子模塊。例如,文件可以包含以下代碼定義了之后,就會把,,導(dǎo)入到當(dāng)前命名空間。這種導(dǎo)入使用前導(dǎo)點(diǎn)來指示相對導(dǎo)入中涉及的當(dāng)前包和父包。也就是說被執(zhí)行的主程序里面不能包含相對導(dǎo)入。
包,Package,是一種Python模塊的集合,從文件組織形式上看,包就是一個(gè)文件夾,里面放著各種模塊(.py文件),也可以有子文件夾(子包)。包名構(gòu)建了一個(gè)Python模塊的命名空間。比如,模塊名A.B表示A包中名為B的子模塊。這種使用加點(diǎn)的模塊名可以讓你寫的軟件包里面的模塊名稱和其它軟件包里面的模塊名稱一樣,但又不相互沖突。
舉個(gè)栗子,我們要設(shè)計(jì)一個(gè)處理圖片的模塊集合(一個(gè)包)。我們知道,圖片有多種不同的文件格式,一般它們以不同的擴(kuò)展名來識別,比如.jpg,.png,.gif等等。為了讀寫不同格式的圖片,你需要對每一種格式建立一個(gè)對應(yīng)的模塊進(jìn)行處理,為了支持更多的圖片格式,你就要增加更多對應(yīng)的模塊。對于圖片你可能還有更多的處理,比如,改變色彩,裁剪,旋轉(zhuǎn)等等,為了實(shí)現(xiàn)這些功能,你又要寫更多的模塊。這樣下來,你的包的結(jié)構(gòu)以文件系統(tǒng)的形式表示如下:
image # 頂級包 ├── __init__.py # 初始化image包 ├── formats # 圖片格式的子包 │?? ├── gif_read.py │?? ├── gif_write.py │?? ├── __init__.py │?? ├── jpg_read.py │?? ├── jpg_write.py │?? ├── png_read.py │?? └── png_write.py └── process # 圖片處理的子包 ├── colors.py ├── crop.py ├── __init__.py └── rotate.py
為了讓目錄成為Python的包,目錄中必須含有一個(gè)__init__.py文件,它可以是空文件但不能不存在。這樣做的目的是為了仿照具有通用名稱的目錄無意中隱藏了在模塊搜索路徑排在后面的有效模塊。比如,你當(dāng)前目錄下有個(gè)time目錄是放程序資源的,它里面沒有__init__.py文件就是一個(gè)普通的目錄。如果Python不要求包目錄下必須含有__init__.py文件,它就會隱藏Python系統(tǒng)的time模塊。
__all__變量前面說了,包的目錄中必須包含一個(gè)__init__.py文件,它可以是空文件,也可以寫包初始化相關(guān)的代碼,或者定義__all__變量。
__all__變量是一個(gè)列表,它列舉了這個(gè)包包含的子模塊的名稱。當(dāng)from package import *語句執(zhí)行時(shí),會把這個(gè)模塊名稱列表里面的模塊名稱導(dǎo)入。所以說__all__是一個(gè)包的顯示索引。如果你覺得從包中導(dǎo)入*的操作沒必要被使用,也可以不定義__all__這個(gè)變量。
例如,文件image/process/init.py可以包含以下代碼:
__all__ = ["colors", "crop", "rotate"]
定義了__all__之后,from image.process import *就會把colors,crop,rotate導(dǎo)入到當(dāng)前命名空間。
實(shí)際寫代碼的實(shí)踐中,import *的做法是嚴(yán)格被禁止的,它容易造成包中模塊名與當(dāng)前命名空間的名稱沖突。
更推薦的方法是from package import submodule或from package import submodule as alias_for_submodule。當(dāng)然,如果兩個(gè)包中有同名的submodule,就不能同時(shí)使用from package import submodule,但可以取個(gè)別名。
導(dǎo)入Python包或Python子模塊導(dǎo)入包的方法和導(dǎo)入模塊的方法一樣:
import image
在程序中引用colors子模塊時(shí):
image.process.colors(...)
接下來,看看我們?nèi)绾螌?dǎo)入一個(gè)包中某單個(gè)模塊:
import image.process.colors
這樣就加載了子模塊image.process.colors,在程序中使用時(shí)必須使用它的全名,而不是簡單的colors。
如果想使用colors這個(gè)名字,就用這種導(dǎo)入語句:
from image.process import colorsPython子包參考
當(dāng)包含有子包時(shí)(與例子中的image包類似),我們可以使用絕對導(dǎo)入來引用兄弟包的子模塊。比如,如果模塊 image.process.crop 需要使用 image.formats 包中的 jpg_read 模塊時(shí),它可以使用?from image.formats import jpg_read。
我們也可以使用?from module import name的形式相對導(dǎo)入。這種導(dǎo)入使用前導(dǎo)點(diǎn).來指示相對導(dǎo)入中涉及的當(dāng)前包和父包。比如,在 crop 模塊中,你可以使用:
from . import colors from .. import formats from ..formats import jpg_read
請主要,相對導(dǎo)入是基于當(dāng)前模塊的名字進(jìn)行導(dǎo)入的。由于主模塊(即被python 執(zhí)行的那個(gè).py文件)的名稱總是"__main__",因此用作Python應(yīng)用程序的主模塊的模塊必須用絕對導(dǎo)入。也就是說被執(zhí)行的主程序里面不能包含相對導(dǎo)入。這一點(diǎn)很重要,切記!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/43796.html
摘要:反正也考不上了,索性破罐子破摔,大周將自己復(fù)習(xí)的資料一股腦送給了同戰(zhàn)的研友,自己研究起了簡歷,開始積極迎戰(zhàn)校招。 小H被裁員了。 作為一名85后的單身未婚女測試員...
航空業(yè)有很多值得我們借鑒和學(xué)習(xí)的工作方式,將來有時(shí)間我會給大家引薦更多實(shí)例。 showImg(https://segmentfault.com/img/remote/1460000013512660?w=680&h=454); 仔細(xì)觀察每架停泊著的飛機(jī),會發(fā)現(xiàn)機(jī)身很多地方都掛著細(xì)長的紅布條,上面寫著REMOVE BEFORE FLIGHT,中文翻譯成飛行前拆除。這種布條沒什么技術(shù)含量,但是非常重要...
摘要:是你學(xué)習(xí)從入門到專家必備的學(xué)習(xí)路線和優(yōu)質(zhì)學(xué)習(xí)資源。的數(shù)學(xué)基礎(chǔ)最主要是高等數(shù)學(xué)線性代數(shù)概率論與數(shù)理統(tǒng)計(jì)三門課程,這三門課程是本科必修的。其作為機(jī)器學(xué)習(xí)的入門和進(jìn)階資料非常適合。書籍介紹深度學(xué)習(xí)通常又被稱為花書,深度學(xué)習(xí)領(lǐng)域最經(jīng)典的暢銷書。 showImg(https://segmentfault.com/img/remote/1460000019011569); 【導(dǎo)讀】本文由知名開源平...
摘要:本文是通過廖雪峰的網(wǎng)站學(xué)習(xí)而整理的真的是很好的教程,省得我花錢買書了,然后我沒有去再整理總結(jié)語法,而是直接通過寫出代碼段來體現(xiàn)自己的學(xué)習(xí),也方便以后的快速復(fù)習(xí)回顧。 不想再像以前那樣,什么都從頭開始學(xué)習(xí)語法、總結(jié)語法,這樣反而會過分糾結(jié)于語法,耽誤了開發(fā),畢竟語言的主要屬性是工具,次要的屬性是語言本身。 所以還是先熟練使用語言去進(jìn)行開發(fā),等足夠熟悉了,再去研究語言本身(編譯原理……)。...
閱讀 1840·2021-11-23 09:51
閱讀 1294·2021-11-18 10:02
閱讀 970·2021-10-25 09:44
閱讀 2108·2019-08-26 18:36
閱讀 1630·2019-08-26 12:17
閱讀 1154·2019-08-26 11:59
閱讀 2751·2019-08-23 15:56
閱讀 3363·2019-08-23 15:05