python代码模板_python 代码模板
python中的Module是比較重要的概念。常見的情況是,事先寫好一個(gè).py文 件,在另一個(gè)文件中需要import時(shí),將事先寫好的.py文件拷貝 到當(dāng)前目錄,或者是在sys.path中增加事先寫好的.py文件所在的目錄,然后import。這樣的做法,對(duì)于少數(shù)文件是可行的,但如果程序數(shù)目很 多,層級(jí)很復(fù)雜,就很吃力了。
有沒有辦法,像Java的Package一樣,將多個(gè).py文件組織起來,以便在外部統(tǒng)一調(diào)用,和在內(nèi)部互相調(diào)用呢?答案是有的。
主要是用到python的包的概念,python __init__.py在包里起一個(gè)比較重要的作用
要弄明白這個(gè)問題,首先要知道,python在執(zhí)行import語句時(shí),到底進(jìn)行了什么操作,按照python的文檔,它執(zhí)行了如下操作:
第1步,創(chuàng)建一個(gè)新的,空的module對(duì)象(它可能包含多個(gè)module);
第2步,把這個(gè)module對(duì)象插入sys.module中
第3步,裝載module的代碼(如果需要,首先必須編譯)
第4步,執(zhí)行新的module中對(duì)應(yīng)的代碼。
在執(zhí)行第3步時(shí),首先要找到module程序所在的位置,其原理為:
如 果需要導(dǎo)入的module的名字是m1,則解釋器必須找到m1.py,它首先在當(dāng)前目錄查找,然后是在環(huán)境變量PYTHONPATH中查找。 PYTHONPATH可以視為系統(tǒng)的PATH變量一類的東西,其中包含若干個(gè)目錄。如果PYTHONPATH沒有設(shè)定,或者找不到m1.py,則繼續(xù)搜索 與python的安裝設(shè)置相關(guān)的默認(rèn)路徑,在Unix下,通常是/usr/local/lib/python。
事實(shí)上,搜索的順序是:當(dāng)前路徑 (以及從當(dāng)前目錄指定的sys.path),然后是PYTHONPATH,然后是python的安裝設(shè)置相關(guān)的默認(rèn)路徑。正因?yàn)榇嬖谶@樣的順序,如果當(dāng)前 路徑或PYTHONPATH中存在與標(biāo)準(zhǔn)module同樣的module,則會(huì)覆蓋標(biāo)準(zhǔn)module。也就是說,如果當(dāng)前目錄下存在xml.py,那么執(zhí) 行import xml時(shí),導(dǎo)入的是當(dāng)前目錄下的module,而不是系統(tǒng)標(biāo)準(zhǔn)的xml。
了解了這些,我們就可以先構(gòu)建一個(gè)package,以普通module的方式導(dǎo)入,就可以直接訪問此package中的各個(gè)module了。
Python中的package定義很簡(jiǎn)單,其層次結(jié)構(gòu)與程序所在目錄的層次結(jié)構(gòu)相同,這一點(diǎn)與Java類似,唯一不同的地方在于,python中的package必須包含一個(gè)__init__.py的文件。
例如,我們可以這樣組織一個(gè)package:
package1/
__init__.py
subPack1/
__init__.py
module_11.py
module_12.py
module_13.py
subPack2/
__init__.py
module_21.py
module_22.py
……
__init__.py可以為空,只要它存在,就表明此目錄應(yīng)被作為一個(gè)package處理。當(dāng)然,__init__.py中也可以設(shè)置相應(yīng)的內(nèi)容,下文詳細(xì)介紹。
好了,現(xiàn)在我們?cè)趍odule_11.py中定義一個(gè)函數(shù):
def funA():
print "funcA in module_11"
return
在頂層目錄(也就是package1所在的目錄,當(dāng)然也參考上面的介紹,將package1放在解釋器能夠搜索到的地方)運(yùn)行python:
>>>from package1.subPack1.module_11 import funcA
>>>funcA()
funcA in module_11
這樣,我們就按照package的層次關(guān)系,正確調(diào)用了module_11中的函數(shù)。
細(xì)心的用戶會(huì)發(fā)現(xiàn),有時(shí)在import語句中會(huì)出現(xiàn)通配符*,導(dǎo)入某個(gè)module中的所有元素,這是怎么實(shí)現(xiàn)的呢?
答案就在__init__.py中。我們?cè)趕ubPack1的__init__.py文件中寫
__all__ = ['module_13', 'module_12']
然后進(jìn)入python
>>>from package1.subPack1 import *
>>>module_11.funcA()
Traceback (most recent call last):
File "", line 1, in
ImportError: No module named module_11
也就是說,以*導(dǎo)入時(shí),package內(nèi)的module是受__init__.py限制的。
好了,最后來看看,如何在package內(nèi)部互相調(diào)用。
如果希望調(diào)用同一個(gè)package中的module,則直接import即可。也就是說,在module_12.py中,可以直接使用
import module_11
如果不在同一個(gè)package中,例如我們希望在module_21.py中調(diào)用module_11.py中的FuncA,則應(yīng)該這樣:
from module_11包名.module_11 import funcA
包機(jī)制
# a.py
def?add_func(a,b):
return?a+b
#?b.py
from?a?import?add_func?#?Also?can?be?:?import?a
print?("Import?add_func?from?module?a")
print?("Result?of?1?plus?2?is:?")
print?(add_func(1,2))????#?If?using?"import?a"?,?then?here?should?be?"a.add_func"
module可以定義在包里面.Python定義包的方式稍微有點(diǎn)古怪,假設(shè)我們有一個(gè)parent文件夾,該文件夾有一個(gè)child子文件夾.child中有一個(gè)module a.py . 如何讓Python知道這個(gè)文件層次結(jié)構(gòu)?很簡(jiǎn)單,每個(gè)目錄都放一個(gè)名為_init_.py 的文件.該文件內(nèi)容可以為空.這個(gè)層次結(jié)構(gòu)如下所示:
parent
--__init_.py
--child
--?__init_.py
--a.py
b.py
那么Python如何找到我們定義的module?在標(biāo)準(zhǔn)包sys中,path屬性記錄了Python的包路徑.你可以將之打印出來:
import?sys
print(sys.path)
通常我們可以將module的包路徑放到環(huán)境變量PYTHONPATH中,該環(huán)境變量會(huì)自動(dòng)添加到sys.path屬性.另一種方便的方法是編程中直接指定我們的module路徑到sys.path 中:
import?sys
import?os
sys.path.append(os.getcwd()+'\\parent\\child')
print(sys.path)
from?a?import?add_func
print?(sys.path)
print?("Import?add_func?from?module?a")
print?("Result?of?1?plus?2?is:?")
print?(add_func(1,2))
知識(shí)點(diǎn):
如何定義模塊和包
如何將模塊路徑添加到系統(tǒng)路徑,以便python找到它們
如何得到當(dāng)前路徑
總結(jié)
以上是生活随笔為你收集整理的python代码模板_python 代码模板的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 观音山门票多少钱啊?
- 下一篇: python比较运算符重载_python