在專案開發過程中,我們經常把專案中常用的功能或演算法寫成乙個可供其它檔案呼叫的函式或類,我們把這些函式和類放在乙個檔案中,這個檔案就叫做模組,因為這個模組是我們自己寫的,所以叫自定義模組。
模組很好的解決了軟體工程中的低耦合,高內聚的要求,我們在專案開發中,把經常被使用的函式和類封裝成模組是個很好的程式設計習慣。
我們自己寫個函式放在乙個字尾名為 py 的檔案裡,如果我們在其它檔案中使用該檔案,這個檔案相對使用它的檔案就叫自定義模組。 自定義模組的引用方式是用 import... ,或者 from...import... , ,但要注意自定義的模組和引用檔案要放在乙個目錄下。下面我們實現乙個定義模組,模組檔名為 mabs.py,我們通常叫模組名為 myabs(不帶字尾名),在該模組內,我們實現乙個函式 myabsfunc,該函式返回數字的絕對值,我們在 hello.py 檔案中引用該自定義模組。
'''
myabs.py 檔案(該檔案為自定義模組 myabs) 。
該模組有乙個函式 myabsfunc。
'''def myabsfunc(data):
try:
data = int(data)
except:
raise typeerror("必須為數字型別")
return data if data >= 0 else -data
'''
hello.py 檔案。
該檔案引用自定義模組 myabs。
'''import myabs # 匯入自定義模組
print(myabs.myabsfunc(-250))
當然我們也可以直接匯入這個模組內的函式。
'''
hello.py 檔案。
該檔案引用自定義模組 myabs。
'''from myabs import myabsfunc # 從自定義模組 myabs 裡匯入函式
print(myabsfunc(-250))
我們可以給 import... 後面的名字起個別名。
'''
hello.py 檔案。
該檔案引用自定義模組 myabs。
'''from myabs import myabsfunc as absfunc # 給函式起個別名
print(absfunc(-250))
################################ 我是分割線 ################################
'''hello.py 檔案。
該檔案引用自定義模組 myabs。
'''import myabs as absmodule # 給函式起個別名
print(absmodule.myabsfunc(-250))
在開發專案中,我們可能要寫很多模組,為了方便與組織,我們可以把這些模組放入乙個目錄中,python 對按目錄來組織模組的方法,稱為包(package),包是模組的集合,比模組又高一級的封裝。 沒有比包更高階別的封裝,但是包可以巢狀包,就像檔案目錄一樣。 匯入包的方式和匯入模組一樣,但要注意,包裡面必須要有乙個 __init__.py 檔案,否則會報錯。 比如在專案 python_one 中,我們建立乙個 mytools 包,把 myabs 模組放入該包中,在 hello.py 中使用該包中的 myabsfunc 函式。
如果我們的包中有多個(比如幾十個)模組,對每個模組都需要使用 from...import... 的方式匯入,那就很 low 了。python 支援用 from...import * 的方式可以匯入 __init__.py 的檔案裡的 __all__ 變數裡面限定的模組。假如我們的 mytools 包裡面有兩個模組 myabs 和 myhaha,我們可以在 __init__.py 裡面限定要匯入的模組。
'''
__init__.py 檔案。
變數 __all__ 的值是對使用 from...import * 語法匯入模組的限定。
'''__all__ = ["myhaha"] # 如果使用 from...import * 語法,則只匯入了 myhaha 模組。
'''
myabs.py 檔案(該檔案為自定義模組 myabs) 。
該模組有乙個函式 myabsfunc。
'''def myabsfunc(data):
try:
data = int(data)
except:
raise typeerror("必須為數字型別")
return data if data >= 0 else -data
'''
myhaha.py 檔案(該檔案為自定義模組 myhaha) 。
該模組有乙個函式 myhahafunc。
'''def myhahafunc():
return "haha"
'''
hello.py 檔案。
該檔案使用 mytools 包。
'''from mytools import * # 只匯入了 __init__.py 檔案裡的 __all__ 變數裡面的模組。
print(myhaha.myhahafunc()) # 正確
print(myabs.myabsfunc(-250)) # 錯誤
當然如果不使用 from...import * 的方式匯入模組,則不受 __init__.py 檔案裡的 __all__ 變數的限制。 比如我們在 __init__.py 檔案裡寫入__all__ = ["myhaha"]
,我們可以直接匯入 myabs 模組。
'''
hello.py 檔案。
該檔案使用 mytools 包。
'''from mytools import myabs
print(myabs.myabsfunc(-250)) # 正確,不受 __all__ 變數的限制
無論是匯入包還是模組還是模組裡的函式,變數,或類等等,import 後面的內容必須是一級單位。
'''
hello.py 檔案。
該檔案使用 mytools 包。
'''import mytools # 正確,匯入 mytools 包
from mytools import myabs # 正確,匯入 mytools 包裡的 myabs 模組
from mytools.myabs import myabsfunc # 正確,匯入 mytools 包裡的 myabs 模組裡的 myabsfunc 函式
import mytools.myabs # 錯誤,import 後面必須是一級單位
from mytools import myabs.myabsfunc # 錯誤,import 後面必須是一級單位
會寫模組並匯入模組。
會寫包並匯入包。
寫兩個模組,放入包中,乙個模組裡面寫乙個 woman 類,乙個模組裡面寫乙個 myprint 函式,供其它檔案呼叫,把 woman 類的物件傳給 myprint 函式,列印出該物件的名字。
自定義模組www.birdpython.com
第十章 檔案和異常
10 1 python 學習筆記 txt檔案 python 可以修 python 可以做遊戲 python 可以爬取資料.py檔案 filename scratch.txt with open filename,encoding utf 8 as file object contents file ...
第十章 10 5 3節練習 10 6節練習
練習10.41 僅根據演算法和引數的名字,描述下面每個標準庫演算法執行什麼操作 a replace beg,end,old val,new val b replace if beg,end,pred,new val c replace copy beg,end,dest,old val,new va...
C語言 第十章檔案編譯
1.預處理 e 進行預處理工作 工作內容 進行預處理 預處理指令 進行巨集替換和標頭檔案匯入或者條件編譯等 去掉注釋內容 不會自動生成檔案 o 可以指定生成的目標檔案 i2.編譯 s 檢查語法錯誤 生成匯程式設計序 工作內容 檢查源 或者經過預處理之後 的語法錯誤 生成匯程式設計序 s3.彙編 其實...