新聞中心
package指的就是包,它是一個(gè)有層次的文件目錄結(jié)構(gòu),它定義了由n個(gè)模塊或n個(gè)子包組成的python應(yīng)用程序執(zhí)行環(huán)境。通俗一點(diǎn):包是一個(gè)包含__init__.py 文件的目錄,該目錄下一定得有這個(gè)__init__.py文件和其它模塊或子包。

但是這會(huì)分為兩種情況,第一種情況是一個(gè)空的__init__.py文件,另外一個(gè)情況是寫(xiě)了代碼的__init__.py文件。不管是空的還是有內(nèi)容的,這個(gè)目錄都會(huì)被認(rèn)為是一個(gè)package,這是一個(gè)標(biāo)識(shí)。
相關(guān)推薦:《Python基礎(chǔ)教程》
package的初始化工作
一個(gè)package 被導(dǎo)入,不管在什么時(shí)候__init__.py的代碼都只會(huì)被執(zhí)行一次
>>> import package hello world >>> import package >>> import package
由于 package 被導(dǎo)入時(shí) __init__.py 中的可執(zhí)行代碼會(huì)被執(zhí)行,所以小心在 package 中放置你的代碼,盡可能消除它們產(chǎn)生的副作用,比如把代碼盡可能的進(jìn)行封裝成函數(shù)或類(lèi)。
__init__.py內(nèi)的導(dǎo)入順序
當(dāng)我嘗試導(dǎo)入
from package import something
import語(yǔ)句會(huì)首先檢查something是不是__init__.py的變量,然后檢查是不是subpackage,再檢查是不是module,最后拋出ImportError。
所以檢查順序如下:
(1)__init__.py 文件內(nèi)變量
(2)是不是package內(nèi)的subpackage
(3)是不是package內(nèi)的module
看個(gè)例子
我們有一個(gè)如下結(jié)構(gòu)的package
在a.py文件內(nèi)有一個(gè)函數(shù)
def bar():
print("Hello, function 'bar' from module 'a' calling")在b.py文件內(nèi)有一個(gè)函數(shù)
def foo():
print("Hello, function 'foo' from module 'b' calling")然后我們添加一個(gè)空的__init__.py 文件在simple_package里面。
我們看下,當(dāng)我們import simple_package的時(shí)候到底會(huì)發(fā)生什么事情(在simple_package內(nèi)激活Python shell或者simple_package的路徑被包含在python的sys.path或者在PYTHONPATH的環(huán)境變量中)
>>> import simple_package >>> >>> simple_package>>> >>> simple_package.a Traceback (most recent call last): File " ", line 1, in NameError: name 'a' is not defined >>> >>> simple_package.b Traceback (most recent call last): File " ", line 1, in NameError: name 'b' is not defined
我們可以看到simple_package已經(jīng)被成功導(dǎo)入,但是a.py和b.py并沒(méi)有被導(dǎo)入
當(dāng)然了,如果你希望使用import simple_package后自動(dòng)加載a或者b 模塊,這里有兩種辦法。
第一種就是在__init__.py內(nèi)導(dǎo)入a或者b模塊,然后保存再激活python的交互環(huán)境
#__init__.py import a import b
當(dāng)你再次嘗試import simple_package后,就可以使用simple_package.a.bar()來(lái)使用模塊a中的bar()函數(shù)了。
第二辦法就是手動(dòng)導(dǎo)入,當(dāng)你想使用模塊a中的bar()函數(shù)時(shí),需要手動(dòng)導(dǎo)入
import simple_package.a as a
然后就是可以a.bar()來(lái)使用bar()函數(shù)了。
網(wǎng)站欄目:創(chuàng)新互聯(lián)Python教程:pythonpackages是什么意思
分享鏈接:http://www.dlmjj.cn/article/dhggicp.html


咨詢(xún)
建站咨詢(xún)
