模塊化編程
Python 有時(shí)候稱為膠水語(yǔ)言,就是因?yàn)樗袕?qiáng)大的可擴(kuò)展性,這個(gè)擴(kuò)展性就是用模塊實(shí)現(xiàn)的。
模塊其實(shí)就是一個(gè)以 .py 結(jié)尾的 Python 文件,這個(gè)文件中可以包含變量、函數(shù)、類等。
這個(gè)模塊可以包含實(shí)現(xiàn)了一個(gè)或者多個(gè)功能的代碼。
模塊可以在其他 Python 文件中使用,可以通過(guò)網(wǎng)絡(luò)進(jìn)行傳播。
這樣的話,如果想在你的程序中實(shí)現(xiàn)某些功能,其實(shí)網(wǎng)絡(luò)的其他程序猿已經(jīng)給你寫好了,下載下來(lái),安裝到自己的環(huán)境下,就可以使用了。
模塊化編程是指將大型,笨拙的編程任務(wù)分解為單獨(dú)的,更小的,更易于管理的子任務(wù)或模塊的過(guò)程。然后可以像構(gòu)建塊一樣拼湊單個(gè)模塊以創(chuàng)建更大的應(yīng)用程序。
在大型應(yīng)用程序中模塊化代碼有幾個(gè)優(yōu)點(diǎn):
簡(jiǎn)單性:模塊通常只關(guān)注問(wèn)題的一小部分,而不是關(guān)注當(dāng)前的整個(gè)問(wèn)題。如果您正在處理單個(gè)模塊,那么您的頭腦中要思考的將有一個(gè)較小的問(wèn)題范圍。這使得開發(fā)更容易,更不容易出錯(cuò)。
可維護(hù)性:模塊通常設(shè)計(jì)為能夠在不同的問(wèn)題域之間實(shí)施邏輯邊界。如果以最小化相互依賴性的方式編寫模塊,則對(duì)單個(gè)模塊的修改將對(duì)程序的其他部分產(chǎn)生影響的可能性降低。(您甚至可以在不了解該模塊之外的應(yīng)用程序的情況下對(duì)模塊進(jìn)行更改。)這使得許多程序員團(tuán)隊(duì)在大型應(yīng)用程序上協(xié)同工作更加可行。
可重用性:單個(gè)模塊中定義的功能可以通過(guò)應(yīng)用程序的其他部分輕松地重用。這消除了重新創(chuàng)建重復(fù)代碼的需要。
范圍:模塊通常定義一個(gè)單獨(dú)的命名空間,這有助于避免程序的不同區(qū)域中的變量名之間的沖突。
函數(shù),模塊和包都是Python中用于促進(jìn)代碼模塊化的構(gòu)造。
一、模塊分類
實(shí)現(xiàn)方式分類
實(shí)際上有兩種不同的方法可以在Python中定義模塊:
- 模塊可以用Python本身編寫。
- 模塊可以用C編寫并在運(yùn)行時(shí)動(dòng)態(tài)加載,就像
re(正則表達(dá)式)模塊一樣。
以上兩種情況下,模塊的內(nèi)容都以相同的方式訪問(wèn):使用import語(yǔ)句
模塊的歸屬分類
- 包含在解釋中的一個(gè)內(nèi)置的模塊本,像
itertools模塊。
- 包含在解釋中的一個(gè)內(nèi)置的模塊本,像
- 其他機(jī)構(gòu)或個(gè)人開發(fā)者編寫的模塊,成為第三方模塊
- 自己寫的
.py文件,就是自定義的模塊
- 自己寫的
第三方模塊
從網(wǎng)絡(luò)上下載的模塊稱為 第三方模塊。
安裝方法
-
pip3工具安裝
例如下面的示例是安裝用于執(zhí)行遠(yuǎn)程主機(jī)命令的模塊paramiko
注意: pip3 是 bash 環(huán)境下的命令
$ pip3 install paramiko
python2.x 使用
pip
python3.x 使用pip3
當(dāng)然這也不是固定的,比如你給pip3定義了一個(gè)別名pip
- 源碼安裝
源碼安裝就是,從網(wǎng)絡(luò)上下載沒有封裝的 python 文件的源碼,之后在本地執(zhí)行其源碼中的 setup.py 文件進(jìn)行安裝。
模塊的源碼一般都有一個(gè)主目錄,主目錄中包含了一個(gè)到多個(gè)子目錄和文件。
但是主目錄下一定有一個(gè) setup.py 的文件,這個(gè)是源碼安裝的入口文件,就是需要執(zhí)行這個(gè)文件并且傳入一個(gè) install 參數(shù)進(jìn)行源碼安裝。
示例:
a. 下載源碼包
wget https://files.pythonhosted.org/packages/4a/1b/9b40393630954b54a4182ca65a9cf80b41803108fcae435ffd6af57af5ae/redis-3.0.1.tar.gz
b. 解壓源碼包
tar -xf redis-3.0.1.tar.gz
- 進(jìn)入模塊源碼的主目錄,并安裝源碼包


上面表示安裝成功
自定義模塊
有的情況下,是需要自己編寫一些模塊的,這種就是自定義模塊了。
示例:
some_mod.py
x = 10
li = ['shark', 18]
def foo():
return 30
class Person():
def __init__(self, name, age):
self.name = name
self.age = age
內(nèi)置模塊
模塊除了 第三方模塊, 自定義模塊,還有 內(nèi)置模塊。
模塊的使用
使用模塊需要先導(dǎo)入模塊名。
模塊名就是把 .py 去掉后的文件名。比如 some_mod.py 的模塊名就是 some_mod
a. 導(dǎo)入模塊
import some_mod
b. 使用模塊中的對(duì)象
要想使用模塊中的變量名或者函數(shù)名等,只需要使用 模塊名.變量名 的方式即可。
例如,下面是使用的了 some_mod 模塊中的 foo 函數(shù)。
import some_mod
some_mod.foo()
更多模塊導(dǎo)入的方式
a. 從模塊中導(dǎo)入其中的一個(gè)對(duì)象
from some_mod import x
b. 從模塊中導(dǎo)入多個(gè)對(duì)象
from some_mod import x, foo
c. 從模塊中導(dǎo)入全部的對(duì)象, 不建議這么做
from some_mod import *
導(dǎo)入模塊時(shí)模塊的代碼會(huì)自動(dòng)被執(zhí)行一次
st = """www.qfecu.com
千峰歡迎您!
www.qfecu.com
千峰歡迎您!
"""
print(st)
二、包
包就是包含了一個(gè) __init__.py 文件的文件夾,這個(gè)文件夾下可以有更多的目錄或文件。就是說(shuō),包里可以用子包或單個(gè) .py 的文件。
其實(shí)包也是模塊,就是說(shuō)包和單一的 .py 文件統(tǒng)稱為模塊。
包的目錄結(jié)構(gòu)

文件 __init__.py
__init__.py 文件,在 Python3.x 中可以沒有,但是在 Python2.x 中必須有。
文件中可以有代碼,也可以是個(gè)空文件,但是文件名不能是其他的。
到導(dǎo)入包的時(shí)候,此文件假如存在,會(huì)以此文件去見包的名稱空間。
也就是說(shuō),導(dǎo)入如包的時(shí)候,只要在 __init__.py 文件中的名稱才可以生效。否則,即使是一個(gè)模塊在包目錄下面也不會(huì)被導(dǎo)入到內(nèi)存中,也就不會(huì)生效。
使用包
示例包目錄機(jī)構(gòu)

使用包也需要導(dǎo)入
a. 單獨(dú)導(dǎo)入包
import package # 注意這樣不會(huì)導(dǎo)入其下面的模塊和子包
b. 從包中導(dǎo)入下面的模塊
from package import t
c. 從包中導(dǎo)入下面的子包,注意這不會(huì)導(dǎo)入子包下面的任何模塊
from package import subpkg
d. 從包的子包中導(dǎo)入子包的模塊
from package.subpkg import som_mod
e. 從包或子包的模塊中導(dǎo)入具體的對(duì)象
from package.t import foo
from package.subpkg.som_mod import x
from package.t import x as y # 把 x 導(dǎo)入后起個(gè)別名 y
記住一點(diǎn):不論是導(dǎo)入包還是模塊,從左向右的順序來(lái)說(shuō),最后一個(gè)點(diǎn)兒的左邊一定是一個(gè)包名,而不能是一個(gè)模塊名
下面是錯(cuò)誤的
import package.t.foo
from package.subpkg import som_mod.x
三模塊的內(nèi)置變量 __name__
每個(gè) .py 文件都有一個(gè)變量名 __name__, 這個(gè)變量名的值會(huì)根據(jù)這個(gè)文件的用途不同而隨之變化。
當(dāng)文件作為模塊被其他文件使用時(shí),
__name__的值是這個(gè)文件的模塊名當(dāng)文件作為腳本(就是作為可執(zhí)行文件)使用時(shí),
__name__的值是字符串類型的'__main__'
通常你會(huì)看到一些 Python 腳本中會(huì)有類似下面的代碼:
some_script.py
def foo():
pass
def func():
pass
def main():
foo()
func()
if __name__ == '__main__':
main()
使用這個(gè)腳本
python3 some_script.py
這樣執(zhí)行這個(gè)腳本的話,其內(nèi)置的
__name__變量的值就是字符串的'__main__'。
這樣的話,if的判斷添加就會(huì)達(dá)成,從而其語(yǔ)句下面的代碼就會(huì)執(zhí)行,main()函數(shù)就會(huì)被調(diào)用 。
模塊名的搜索路徑
當(dāng)你導(dǎo)入模塊或者包的時(shí)候, 查找模塊或包的順序:
系統(tǒng)會(huì)先從當(dāng)前目錄下查找
之后再?gòu)?code>sys.path 輸出的值中的路徑里查找模塊名或者包名。
import sys
print(sys.path)
sys.path 輸出的值是一個(gè) Python 的列表,這個(gè)列表我們可以對(duì)其修改的。
比如我們可以把某個(gè)文件的路徑添加到此列表中,通常會(huì)這么做。
run.py
import os,sys
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, BASE_DIR)