概述
基于官方指南的6. Modules進(jìn)行學(xué)習(xí)的
https://docs.python.org/2/tutorial/modules.html#tut-standardmodules
根據(jù)例子逐個(gè)分析
例子思路
- 根據(jù)原理的描述找包或者模塊時(shí)滥酥,系統(tǒng)先去找bulid-in搔扁,再在系統(tǒng)的python環(huán)境變量下找第三方的包文件澈蚌,然后再找其他的。
這里我們只研究自己需要導(dǎo)入的包和模塊的關(guān)系。 - 如果找自己的包或者模塊,是先在平級(jí)目錄找,然后再順著找下級(jí)目錄吆你。
- 從上面的初步原理看,例子結(jié)構(gòu)設(shè)計(jì)如下:
sound/
__init__.py
top.py
test_main.py
effects/
__init__.py
echo.py
surround.py
third/
__init__.py
third1.py
formats/
__init__.py
wavread.py
- 三層目錄結(jié)構(gòu)俊犯,頂層是
sound
妇多;中間是'effects'和formats
;第三層是在effects
目錄下增加一層third
目錄燕侠。 - 每層均包含一個(gè)
__init__.py
文件者祖,文件初始內(nèi)容如下:
print "============== sound.__init__ =============="
print dir()
- 主執(zhí)行文件是
test_main.py
,初始內(nèi)容如下:
print "============== test_main.py =============="
print dir()
def test():
print "============== test_main.test =============="
if __name__ == '__main__'
test()
- 其他的文件基本內(nèi)容如下:
print "============== surround.py =============="
print dir()
def test():
print "============== surround.test =============="
echo.py
比其他的多了一個(gè)test1函數(shù)绢彤,函數(shù)內(nèi)容跟test一模一樣七问,就是名字有變化。
- 實(shí)驗(yàn)的思路是茫舶,先在頂層平行導(dǎo)入械巡,再向下導(dǎo)入(包括越級(jí));再從下往上導(dǎo)入饶氏;最后是驗(yàn)證二層平行目錄下的文件導(dǎo)入坟比。
頂層平行導(dǎo)入
就是sound
目錄下,test_main.py
導(dǎo)入并調(diào)用top.py
的函數(shù)嚷往。
- 在
test_main.py
中葛账,直接調(diào)用top.test()
會(huì)拋出異常,運(yùn)行結(jié)果如下:
============== test_main.py ==============
Traceback (most recent call last):
File "E:\WorkSpace\Python\test\sound\test_main.py", line 6, in <module>
top.test()
NameError: name 'top' is not defined
['__builtins__', '__doc__', '__file__', '__name__', '__package__']
[Finished in 0.2s with exit code 1]
- 去掉調(diào)用
top.test()
的代碼皮仁,加上import top
籍琳,也就是只導(dǎo)入不調(diào)用。
我們會(huì)發(fā)現(xiàn)贷祈,代碼在導(dǎo)入時(shí)就已經(jīng)執(zhí)行了top的全局代碼趋急,而且多出了一個(gè)編譯后的top.pyc文件。
另外一個(gè)變化是test_main.py的dir()輸出势誊,多了一個(gè)導(dǎo)入的top元素呜达。
修改后的代碼:
# 導(dǎo)入top
import top
# test_mian.py原始內(nèi)容
print "============== test_main.py =============="
print dir()
def test():
print "============== test_main.test =============="
# main()
if __name__ == '__main__':
test()
運(yùn)行結(jié)果:
============== top.py ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__']
============== test_main.py ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'top']
============== test_main.test ==============
[Finished in 0.2s]
- 我們?cè)诘?步的基礎(chǔ)上,增加
top.test()
的調(diào)用粟耻,可以正常運(yùn)行查近。
運(yùn)行結(jié)果:
============== top.py ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__']
============== top.test ==============
============== test_main.py ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'top']
============== test_main.test ==============
[Finished in 0.2s]
- 我們將第上面的
import top
替換成from top import test
。我們先刪除調(diào)用test()
函數(shù)的代碼挤忙,先僅僅實(shí)驗(yàn)一下導(dǎo)入的情況霜威。
基礎(chǔ)代碼如下:
# 導(dǎo)入top
from top import test
# test_mian.py原始內(nèi)容
print "============== test_main.py =============="
print dir()
def test():
print "============== test_main.test =============="
# main()
if __name__ == '__main__':
test()
運(yùn)行結(jié)果:
============== top.py ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__']
============== test_main.py ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'test']
============== test_main.test ==============
[Finished in 0.2s]
從運(yùn)行結(jié)果看,跟import top
方式導(dǎo)入結(jié)果基本一致册烈。唯一區(qū)別的地方在于dir()顯示戈泼,from方式導(dǎo)入的是test,并沒有導(dǎo)入top;而import方式導(dǎo)入的是top大猛,而沒有top下面的test扭倾。
另外,如果是from xx import *
方式的話挽绩,top里面有多少函數(shù)或者類都會(huì)載入膛壹。
內(nèi)容太長(zhǎng),網(wǎng)頁無法保存琼牧,所以強(qiáng)行拆分成幾篇文章記錄