1. 程式人生 > 程式設計 >淺談Python中的模組

淺談Python中的模組

模組

為了編寫可維護的程式碼,我們把很多函式分組,分別放到不同的檔案裡,這樣,每個檔案包含的程式碼就相對較少,很多程式語言都採用這種組織程式碼的方式。在Python中,一個.py檔案就稱之為一個模組(Module)。

使用模組有什麼好處?

當一個模組編寫完畢,就可以被其他地方引用。我們在編寫程式的時候,也經常引用其他模組,包括Python內建的模組和來自第三方的模組。

模組還可以避免函式名和變數名衝突。相同名字的函式和變數完全可以分別存在不同的模組中。但是也要注意,儘量不要與內建函式名字衝突。

如果不同的人編寫的模組名相同怎麼辦?為了避免模組名衝突,Python又引入了按目錄來組織模組的方法,稱為包(Package)。

假設我們的abc和xyz這兩個模組名字與其他模組衝突了,於是我們可以通過包來組織模組,避免衝突。方法是選擇一個頂層包名,比如mycompany,按照如下目錄存放:

淺談Python中的模組

引入了包以後,只要頂層的包名不與別人衝突,那所有模組都不會與別人衝突。現在,abc.py模組的名字就變成了mycompany.abc,類似的,xyz.py的模組名變成了mycompany.xyz。

請注意,每一個包目錄下面都會有一個__init__.py的檔案,這個檔案是必須存在的,否則,Python就把這個目錄當成普通目錄,而不是一個包。init.py可以是空檔案,也可以有Python程式碼,因為__init__.py本身就是一個模組,而它的模組名就是mycompany。

使用模組

!/usr/bin/env python3
# -*- coding: utf-8 -*-
' a test module '
__author__ = 'Michael Liao'
import sys
def test():
 args = sys.argv
 if len(args)==1:
 print('Hello,world!')
 elif len(args)==2:
 print('Hello,%s!' % args[1])
 else:
 print('Too many arguments!')

if __name__=='__main__':
 test()

第1行和第2行是標準註釋,第1行註釋可以讓這個hello.py檔案直接在Unix/Linux/Mac上執行,第2行註釋表示.py檔案本身使用標準UTF-8編碼;

第4行是一個字串,表示模組的文件註釋,任何模組程式碼的第一個字串都被視為模組的文件註釋;

第6行使用__author__變數把作者寫進去,這樣當你公開原始碼後別人就可以瞻仰你的大名;

以上就是Python模組的標準檔案模板

使用sys模組的第一步,就是匯入該模組import sys 匯入sys模組後,我們就有了變數sys指向該模組,利用sys這個變數,就可以訪問sys模組的所有功能。

sys模組有一個argv變數,用list儲存了命令列使用模組時輸入的所有引數。argv至少有一個元素,因為第一個引數永遠是該.py檔案的名稱,例如:

執行python3 hello.py獲得的sys.argv就是['hello.py'];
執行python3 hello.py Michael獲得的sys.argv就是['hello.py','Michael]。

工具指令碼就是通過sys.argv讀取使用引數

最後,注意到這兩行程式碼

if __name__=='__main__':
 test()

當我們在命令列執行hello模組檔案時,Python直譯器把一個特殊變數__name__置為__main__,而如果在其他地方匯入該hello模組時,__name__則為其他地方,if判斷將失敗,因此,這種if測試可以讓一個模組通過命令列執行時執行一些額外的程式碼,最常見的就是執行測試

比如:

如果直接命令列使用python3 hello.py,__name____main__,滿足if,執行test()
如果從test.py匯入使用hello.py模組,__name__就為test,不滿足if,也就不會執行test()

作用域

在一個模組中,我們可能會定義很多函式和變數,但有的函式和變數我們希望給別人使用,有的函式和變數我們希望僅僅在模組內部使用。在Python中,是通過_字首來實現的。
正常的函式和變數名是公開的(public),可以被直接引用,比如:abc,x123,PI等;

類似__xxx__這樣的變數是特殊變數,可以被直接引用,但是有特殊用途,比如上面的__author__,__name__就是特殊變數,hello模組定義的文件註釋也可以用特殊變數__doc__訪問,我們自己的變數一般不要用這種變數名;

類似_xxx和__xxx這樣的函式或變數就是非公開的(private),不應該被直接引用,比如_abc,__abc等;

之所以我們說,private函式和變數“不應該”被直接引用,而不是“不能”被直接引用,是因為Python並沒有一種方法可以完全限制訪問private函式或變數,但是,從程式設計習慣上不應該引用private函式或變數。

換句話說,僅僅是宣告而已,要訪問還是能訪問的,private函式或變數不應該被別人引用,那它們有什麼用呢?

ef _private_1(name):
 return 'Hello,%s' % name
def _private_2(name):
 return 'Hi,%s' % name
def greeting(name):
 if len(name) > 3:
 return _private_1(name)
 else:
 return _private_2(name)

我們在模組裡公開greeting()函式,而把內部邏輯用private函式隱藏起來了,這樣,呼叫greeting()函式不用關心內部的private函式細節,這也是一種非常有用的程式碼封裝和抽象的方法,即:

外部不需要引用的函式全部定義成private,只有外部需要引用的函式才定義為public。

以上就是淺談Python中的模組的詳細內容,更多關於python模組的資料請關注我們其它相關文章!