第十三章 模塊和包

模塊化編程

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中定義模塊

  1. 模塊可以用Python本身編寫。
  2. 模塊可以用C編寫并在運(yùn)行時(shí)動(dòng)態(tài)加載,就像re正則表達(dá)式)模塊一樣。

以上兩種情況下,模塊的內(nèi)容都以相同的方式訪問(wèn):使用import語(yǔ)句

模塊的歸屬分類

    1. 包含在解釋中的一個(gè)內(nèi)置的模塊本,像itertools模塊。
    1. 其他機(jī)構(gòu)或個(gè)人開發(fā)者編寫的模塊,成為第三方模塊
    1. 自己寫的 .py 文件,就是自定義的模塊

第三方模塊

從網(wǎng)絡(luò)上下載的模塊稱為 第三方模塊。

安裝方法

  1. pip3 工具安裝
    例如下面的示例是安裝用于執(zhí)行遠(yuǎn)程主機(jī)命令的模塊 paramiko

注意: pip3 是 bash 環(huán)境下的命令

$ pip3 install paramiko

python2.x 使用 pip
python3.x 使用 pip3
當(dāng)然這也不是固定的,比如你給 pip3 定義了一個(gè)別名 pip

  1. 源碼安裝

源碼安裝就是,從網(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

  1. 進(jìn)入模塊源碼的主目錄,并安裝源碼包
image
image

上面表示安裝成功

自定義模塊

有的情況下,是需要自己編寫一些模塊的,這種就是自定義模塊了。

示例:

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)

image

文件 __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)

image

使用包也需要導(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è)文件的用途不同而隨之變化。

  1. 當(dāng)文件作為模塊被其他文件使用時(shí),__name__ 的值是這個(gè)文件的模塊名

  2. 當(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í)候, 查找模塊或包的順序:

  1. 系統(tǒng)會(huì)先從當(dāng)前目錄下查找

  2. 之后再?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)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、模塊化編程 1. 簡(jiǎn)介 Python 有時(shí)候稱為膠水語(yǔ)言,就是因?yàn)樗袕?qiáng)大的可擴(kuò)展性,這個(gè)擴(kuò)展性就是用模塊實(shí)現(xiàn)...
    運(yùn)維開發(fā)_西瓜甜閱讀 2,402評(píng)論 0 13
  • 模塊和包 一 模塊 1 什么是模塊? 常見的場(chǎng)景:一個(gè)模塊就是一個(gè)包含了python定義和聲明的文件,文件名就是...
    go以恒閱讀 2,348評(píng)論 0 4
  • Distutils可以用來(lái)在Python環(huán)境中構(gòu)建和安裝額外的模塊。新的模塊可以是純Python的,也可以...
    MiracleJQ閱讀 3,254評(píng)論 0 1
  • [TOC] 最開始寫程序的時(shí)候,都是一個(gè)文件里輸入幾行源碼(python 的一個(gè) web 框架bottle就特別強(qiáng)...
    人世間閱讀 5,890評(píng)論 1 10
  • 贊李老師 三十六年講臺(tái)上, 風(fēng)華正茂李佩芳。 嘔心瀝血育人才, 千百學(xué)子今翱翔。 相機(jī)時(shí)刻在肩上, 抓住機(jī)會(huì)即...
    行者順達(dá)閱讀 465評(píng)論 0 0

友情鏈接更多精彩內(nèi)容