模塊與包是任何大型程序的核心讨惩,就連 Python 安裝程序本身也是一個(gè)包。
重點(diǎn)涉及有關(guān)模塊和包的常用編程技術(shù)氏身,例如如何組織包巍棱、把大型模塊分割成多個(gè)文件、創(chuàng)建命名空間包蛋欣。同時(shí)航徙,也給出了讓你自定義導(dǎo)入語(yǔ)句的秘籍。
模塊陷虎、包到踏、庫(kù)之間的概念:
模塊(module)其實(shí)就是 py 文件,里面定義了一些函數(shù)泻红、類夭禽、變量等
包(package)是多個(gè)模塊的聚合體形成的文件夾霞掺,里面可以是多個(gè) py 文件谊路,也可以嵌套文件夾
庫(kù)是參考其他編程語(yǔ)言的說法,是指完成一定功能的代碼集合菩彬,在 Python 中的形式就是模塊和包
模塊其實(shí)一個(gè) py 文件缠劝,用來封裝一組功能;包是將一類模塊歸集到一起骗灶,比模塊的概念更大一些惨恭;庫(kù)就是由其它程序員封裝好的功能組,一般比包的概念更大一些耙旦。
模塊
Python 模塊(Module)脱羡,是一個(gè) Python 文件,以 .py 結(jié)尾免都,包含了 Python 對(duì)象定義和Python語(yǔ)句锉罐,方便我們?cè)俅问褂玫臅r(shí)候,提高代碼的復(fù)用率绕娘。通過 import 載入定義好的 Python 模塊脓规。
定義Python 模塊
#support.py
def print_func( par ):
print "Hello : ", par
return
引入Python模塊
模塊定義好后,我們可以使用 import 語(yǔ)句來引入模塊险领,語(yǔ)法如下:
import module1[, module2[,... moduleN]]
在調(diào)用模塊中的函數(shù)時(shí)侨舆,必須這樣引用:
import module.function
當(dāng)解釋器遇到 import 語(yǔ)句秒紧,如果模塊在當(dāng)前的搜索路徑就會(huì)被導(dǎo)入。
搜索路徑是一個(gè)解釋器會(huì)先進(jìn)行搜索的所有目錄的列表挨下。如想要導(dǎo)入模塊 support.py熔恢,需要把命令放在腳本的頂端:
#test.py
# 導(dǎo)入模塊
import support
# 現(xiàn)在可以調(diào)用模塊里包含的函數(shù)了
support.print_func("Python")
結(jié)果:Hello:Python
一個(gè)模塊只會(huì)被導(dǎo)入一次,不管你執(zhí)行了多少次import复颈。這樣可以防止導(dǎo)入模塊被一遍又一遍地執(zhí)行绩聘。
from…import 語(yǔ)句
Python 的 from 語(yǔ)句讓你從模塊中導(dǎo)入一個(gè)指定的部分到當(dāng)前命名空間中。語(yǔ)法如下:
from modname import name1[, name2[, ... nameN]]
例如耗啦,要導(dǎo)入模塊 fib 的 fibonacci 函數(shù)凿菩,使用如下語(yǔ)句:
from fib import fibonacci
這個(gè)聲明不會(huì)把整個(gè) fib 模塊導(dǎo)入到當(dāng)前的命名空間中,它只會(huì)將 fib 里的 fibonacci 單個(gè)引入到執(zhí)行這個(gè)聲明的模塊的全局符號(hào)表帜讲。
from…import* 語(yǔ)句
把一個(gè)模塊的所有內(nèi)容全都導(dǎo)入到當(dāng)前的命名空間也是可行的衅谷,只需使用如下聲明:
from modname import *
這提供了一個(gè)簡(jiǎn)單的方法來導(dǎo)入一個(gè)模塊中的所有項(xiàng)目。然而這種聲明不該被過多地使用似将。
例如我們想一次性引入 math 模塊中所有的東西获黔,語(yǔ)句如下:
from math import *
搜索路徑
當(dāng)你導(dǎo)入一個(gè)模塊,Python 解析器對(duì)模塊位置的搜索順序是:
1在验、當(dāng)前目錄
2玷氏、如果不在當(dāng)前目錄,Python 則搜索在 shell 變量 PYTHONPATH 下的每個(gè)目錄腋舌。
3盏触、如果都找不到,Python會(huì)察看默認(rèn)路徑块饺。UNIX下赞辩,默認(rèn)路徑一般為/usr/local/lib/python/。
模塊搜索路徑存儲(chǔ)在 system 模塊的 sys.path 變量中授艰。變量里包含當(dāng)前目錄辨嗽,PYTHONPATH和由安裝過程決定的默認(rèn)目錄。
PYTHONPATH 變量
作為環(huán)境變量淮腾,PYTHONPATH 由裝在一個(gè)列表里的許多目錄組成糟需。PYTHONPATH 的語(yǔ)法和 shell 變量 PATH 的一樣。
在 Windows 系統(tǒng)谷朝,典型的 PYTHONPATH 如下:
set PYTHONPATH=c:\python27\lib;
Python中的包
包是一個(gè)分層次的文件目錄結(jié)構(gòu)洲押,它定義了一個(gè)由模塊及子包,和子包下的子包等組成的 Python 的應(yīng)用環(huán)境徘禁。
簡(jiǎn)單來說诅诱,包就是文件夾,但該文件夾下必須存在 init.py 文件, 該文件的內(nèi)容可以為空送朱。init.py 用于標(biāo)識(shí)當(dāng)前文件夾是一個(gè)包娘荡。
考慮一個(gè)在 package_pythonStudy 目錄下的 pythonStudy1.py干旁、pythonStudy2.py、init.py 文件炮沐,test.py 為測(cè)試調(diào)用包的代碼争群,目錄結(jié)構(gòu)如下:
test.py
package_pythonStudy
|-- init.py
|-- pythonStudy1.py
|-- pythonStudy2.py
示例:
#package_pythonStudy/pythonStudy1.py
def study1():
print "I'm in pythonStudy1"
#package_pythonStudy/pythonStudy2.py
def study2():
print "I'm in pythonStudy2"
#package_pythonStudy/__init__.py
if __name__ == '__main__':
print '作為主程序運(yùn)行'
else:
print 'package_pythonStudy 初始化'
然后我們?cè)?package_pythonStudy 同級(jí)目錄下創(chuàng)建 test.py 來調(diào)用 package_pythonStudy包
# 導(dǎo)入 package_pythonStudy 包
from package_pythonStudy.pythonStudy1 import study1
from package_pythonStudy.pythonStudy2 import study2
study1()
study2()
運(yùn)行結(jié)果:
package_pythonStudy 初始化
I'm in pythonStudy1
I'm in pythonStudy2