1. 程式人生 > >零基礎學習 Python 之模組

零基礎學習 Python 之模組

寫在之前

隨著我們對 Python 的逐步學習,相信 Python 的強大你也感覺到了,它主要體現在 Python 的「模組」上,因為 Python 不僅有很強大的標準庫,還有數不勝數的第三方模組(或者包,庫),並且許多的開發者還在不斷的貢獻著自己的新模組。

正是因為 Python 強大的「模組自信」和它開放包容的態度,Python 才被很多人所鍾愛,並且這種方式也在不斷的被其他更多的語言所借鑑,幾乎成了普世行為。

編寫模組

學到現在,相信你已經很熟悉 import 語句了,下面我們來看一個之前說過的例子:

>>> import math
>>> math.pow(2,3)
8.0

這裡的 math 就是 Python 標準庫中的一個,用 import 引入這個模組,然後可以使用他這裡面的方法,比如 pow()。顯然不需要自己動手來寫具體的函式,我們要做的就是拿過來直接用,這就是模組的好處。

這裡有一點需要注意的是,我們所說的「模組」,「庫」,「包」什麼的是有區別的,只不過我們現在不區分,隨著學習的深入就會慢慢明白的。

模組是什麼?

模組是什麼?「模組是程式」!大佬們的話一語道破本質,它就是一個副檔名為 .py 的 Python 程式,我們要在應該使用它的時候將它引用過來,不需要重寫雷同的程式碼。

這裡可能會有人問:但是如果要我們自己寫一個 .py 檔案,是不是就可以作為模組 import 呢?事情遠沒有那麼簡單,還必須讓 Python 直譯器可以找到你寫的模組才可以:比如我們在 /usr/lib 下建了一個名為

test.py 的檔案,你想把它作為一個模組引入,就必須先告訴 Python 直譯器我們寫了這麼一個檔案:

>>>import sys
>>>sys,path.append("/usr/lib/test.py")

用上述的方式就是告訴 Python 直譯器我們寫的那個檔案在哪裡,在這個告訴的方法中也用了 import sys,不過 sys 是 Python 的標準之一,所以不需要特別告訴 Python 直譯器的位置。

上面的是在 Ubuntu 系統的地址格式(我隨手寫的地址),如果用的是 windows 的話,則要注意檔案路徑的寫法,直接 import test 就好,然後再呼叫裡面的東西就好了,形式是「模組名.屬性或類」,當然,如果不存在的話就會報錯。

到這裡,你可以去看一下你剛才儲存的 test.py 的目錄中,是不是又多了一個 pycache 的目錄,並且該目錄下還有 pm.cpython-**.pyc 檔案,這個就是剛才 test.py 檔案編譯之後的檔案。

不知道你是否還記得前面寫完程式然後要執行時我們常常用到 if name == “main”,那時候我們直接用 python **.py 的格式來執行該程式,此時我們同樣也有了 .py 檔案,不過在這裡是作為模組引入的。

PS:一般情況下,如果僅僅時作為模組引入,不必寫 name == “main”。

模組的位置

為了讓我們自己寫的模組可以被 Python 直譯器知道,需要用 sys.path.append("/usr/lib/test.py")。你看,這多麻煩,這麼麻煩還是我們 Python 嘛!所以,Python 想了一招,把所有可用的模組都加入到了 sys.path 中,用下面的方法可以看到模組所在的位置:

>>> import sys
>>> import pprint
>>> pprint.pprint(sys.path)

打印出來的結果,你可以看到我們自己寫的那個檔案,結果列表裡所包括位置內的 .py 檔案都可以作為模組引入。

將模組檔案放到指定的位置是一種不錯的方法,但是作為一個放飛自己愛自由的程式設計師,你就得想能不能放到別處呢?答案是肯定的,用 sys.path.append() 就可以做到,不管把檔案放在哪裡,都可以把其位置告訴 Python 直譯器。雖然這種方法在前面使用了,但其實這個很不常用,因為它也有麻煩的地方,比如在互動模式下,如果關閉了當前的 terminal,再重新開啟一個的話又得重新告知。那麼有沒有舒服點的方法呢?有的,比較常用的就是「設定環境變數」,相信這個對於現在的你來說是小菜一碟的事情,實在不會的話隨便 Google 一下,答案一大把。

all 在模組中的作用

首先,我們先來寫一個模組,且把它命名為 test.py

public_name = 'Hello,this is public name.'
_private_name = 'Hello,thos is private name.'

def public_man():
   print('i am a man,i am from public')

def _private_man():
   print('i am a man,i am from private')

接下來就是我們熟悉的操作了,進入到互動模式,test.py 這個檔案就是一個模組,該模組中包含了變數和函式

>>>import sys
>>>sys.path.append("save file site")
>>>from test import *
>>>public_name
'Hello,this is public name'
>>> _private_name
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
NameError: name '_private_name' is not defined

以上變數 public_name 可以被使用,但是另一個變數 _private_name 不能被呼叫,我們先來看一下兩者的區別,後者是以單下劃線開頭的,說明這是一個「私有變數」。而 from test import * 的含義是「希望可以訪問模組(test)中有許可權訪問的全部名稱」,那些被視為私有的變數或者函式或者類等,當然是沒許可權訪問的。

再比如以下的操作:

>>>public_man()
i am a man,i am from public
>>> _private_man()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
NameError: name '_private_man' is not defined

然後,這個其實不是絕對的,如果想要訪問具有私有性質的東西,可以像下面這樣操作:

>>>import test
>>>test._private_man()
i am a man,i am from private
>>>test._private_name
'Hello,this is private name.'

下面讓我們對 test.py 進行改寫,增加一些東西:

__all__ = ['_private_name','public_man']

public_name = 'Hello,this is public name.'
_private_name = 'Hello,thos is private name.'

def public_man():
   print('i am a man,i am from public')

def _private_man():
   print('i am a man,i am from private')

在上面這個修改的 test.py 檔案中,增加了 all 屬性及其相應的值,在列表中包含了一個私有變數和一個函式的名字,這個其實是在告訴引用本模組的直譯器,這兩個東西是有許可權被訪問的,而且只有這兩個東西。

>>>import sys
>>>sys.path.append('file save site')
>>>from test import *
>>>_private_name
Hello,this is public name

果不其然,曾經不能被訪問的私有變數現在能夠訪問了。

>>> public_name
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
NameError: name 'public_name' is not defined

因為上述的變數沒有在 all 的值中,雖然曾經可以被訪問,但是現在就不行了,剩下的幾個也是如此,可以自行嘗試一番。

這個只不過是再次說明前面的結論罷了。當然,如果以 import test 引入模組,再用 test._private_man() 的方式是一樣的。

包 & 庫

其實看名字我們大體可以知道,「包 & 庫」應該是比模組大的。事實上也是如此,一般來講,一個「包」裡面會有多個模組,當然「庫」是一個更大的概念,拿 Python 來說,Python 標準庫中的每個庫都有好多個包,每個包又有好多個模組。

既然一個包裡有多個模組,那麼這個所謂的「包」其實可以看做是我們熟悉的「目錄」,現在就需要解決如何引用某個目錄中的模組問題了,解決辦法就是在該目錄中放一個 init.py 的空檔案,將它放在某個目錄中,就可以將該目錄中的其它 .py 檔案作為模組被引用。

寫在之後

模組的小入門到這就結束了,不知道你掌握了多少。不知道你有沒有聽說過「Python 自帶 “電池”」這句話,在 Python 被安裝的時候,就有不少模組隨著安裝到了本地的計算機上,這些東西讓 Python 擁有了無限生機,我們將這些在安裝 Python 時就預設已經安裝好的模組統稱為「標準庫」,熟悉標準庫是學習程式設計必須要做的事,所以,這就是我們明天要繼續幹的活。

更多內容,歡迎關注公眾號「Python空間」,期待和你的交流。

在這裡插入圖片描述