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