自定義模組

2022-08-18 17:42:14 字數 4131 閱讀 4867

目錄為什麼要使用模組?

人們常說的指令碼是什麼?

模組的分類

2. import

3 from ... import ...

4. py檔案的兩種功能

目錄為什麼要使用模組?

人們常說的指令碼是什麼?

模組的分類

2. import

3 from ... import ...

4. py檔案的兩種功能

乙個函式封裝乙個功能,你使用的軟體可能就是由n多個函式組成的(先備考慮物件導向)。比如抖音這個軟體,不可能將所有程式都寫入乙個檔案,所以咱們應該將檔案劃分,這樣其組織結構要好並且**不冗餘。加入分了10個檔案,每個檔案裡面可能都有相同的功能(函式),怎麼辦?所以將這些相同的功能封裝到乙個檔案中,那麼這個儲存著很多常用的功能的py檔案,就是模組。 模組就是檔案,存放一堆常用的函式,誰用誰拿。怎麼拿?比如:我要策馬奔騰共享人世繁華,應該怎麼樣?我應該騎馬,你也要去浪,你是不是也要騎馬。 我們說乙個函式就是乙個功能,那麼把一些常用的函式放在乙個py檔案中,這個檔案就稱之為模組,模組,就是一些列常用功能的集合體。
從檔案級別組織程式,更方便管理 隨著程式的發展,功能越來越多,為了方便管理,我們通常將程式分成乙個個的檔案,這樣做程式的結構更清晰,方便管理。這時我們不僅僅可以把這些檔案當做指令碼去執行,還可以把他們當做模組來匯入到其他的模組中,實現了功能的重複利用

如果你退出python直譯器然後重新進入,那麼你之前定義的函式或者變數都將丟失,因此我們通常將程式寫到檔案中以便永久儲存下來,需要時就通過python test.py方式去執行,此時test.py被稱為指令碼script。

所以,指令碼就是乙個python檔案,比如你之前寫的購物車,模擬登入系統的檔案等等。

python語言中,模組分為三類。

第一類:

內建模組,也叫做標準庫。此類模組就是python直譯器給你提供的,比如我們之前見過的time模組,os模組。標準庫的模組非常多(200多個,每個模組又有很多功能),我們這幾天就講常用的十幾種,後面課程中還會陸續的講到。

第二類:

第三方模組,第三方庫。一些python大神寫的非常好用的模組,必須通過pip install 指令安裝的模組,比如beautfulsoup, django,等等。大概有6000多個。

第三類:

自定義模組。我們自己在專案中定義的一些模組。

我們先定義乙個模組,定義乙個模組其實很簡單就是寫乙個檔案,裡面寫一些**(變數,函式)即可。此檔案的名字為tbjx.py,檔案內容如下:

view code

2.1 import 使用

import 翻譯過來是乙個匯入的意思。

模組可以包含可執行的語句和函式的定義,這些語句的目的是初始化模組,它們只在模組名第一次遇到匯入import語句時才執行(import語句是可以在程式中的任意位置使用的,且針對同乙個模組很import多次,為了防止你重複匯入,python的優化手段是:第一次匯入後就將模組名載入到記憶體了,後續的import語句僅是對已經載入到記憶體中的模組物件增加了一次引用,不會重新執行模組內的語句),如下 ​import tbjx #只在第一次匯入時才執行tbjx.py內**,此處的顯式效果是只列印一次'from the tbjx.py',當然其他的頂級**也都被執行了,只不過沒有顯示效果.
view code

2.2 第一次匯入模組執行三件事

1.建立乙個以模組名命名的命名空間。

2.執行這個命名空間(即匯入的模組)裡面的**。

3.通過此模組名. 的方式引用該模組裡面的內容(變數,函式名,類名等)。 這個名字和變數名沒什麼區別,都是『第一類的』,且使用tbjx.名字的方式可以訪問tbjx.py檔案中定義的名字,tbjx.名字與test.py中的名字來自兩個完全不同的地方。

ps:重複匯入會直接引用記憶體中已經載入好的結果

2.3 被匯入模組有獨立的命名空間
每個模組都是乙個獨立的命名空間,定義在這個模組中的函式,把這個模組的命名空間當做全域性命名空間,這樣我們在編寫自己的模組時,就不用擔心我們定義在自己模組中全域性變數會在被匯入時,與使用者的全域性變數衝突。
示例:

view code

2.4 為模組起別名

別名其實就是乙個外號

1. 好處可以將很長的模組名改成很短,方便使用.
view code

2. 有利於**的擴充套件和優化。

view code

2.5 匯入多個模組

我們以後再開發過程中,免不了會在乙個檔案中,匯入多個模組,推薦寫法是乙個乙個匯入。
3.1 from ... import ... 使用

view code

唯一的區別就是:使用from...import...則是將spam中的名字直接匯入到當前的命名空間中,所以在當前命名空間中,直接使用名字就可以了、無需加字首:tbjx.
from...import...的方式有好處也有壞處

好處:使用起來方便了

壞處:容易與當前執行檔案中的名字衝突

示例演示:

執行檔案有與模組同名的變數或者函式名,會有覆蓋效果。

view code

2. 當前位置直接使用read1和read2就好了,執行時,仍然以tbjx.py檔案全域性命名空間

view code

3.4 一行匯入多個

from tbjx import read1,read2,name

3.5 from ... import *

from spam import *  把tbjx中所有的不是以下劃線(_)開頭的名字都匯入到當前位置

大部分情況下我們的python程式不應該使用這種匯入方式,因為*你不知道你匯入什麼名字,很有可能會覆蓋掉你之前已經定義的名字。而且可讀性極其的差,在互動式環境中匯入時沒有問題。

可以使用all來控制*(用來發布新版本),在tbjx.py中新增一行

all=['money','read1'] #這樣在另外乙個檔案中用from spam import *就這能匯入列表中規定的兩個名字

3.6 模組迴圈匯入問題

模組迴圈/巢狀匯入丟擲異常的根本原因是由於在python中模組被匯入一次之後,就不會重新匯入,只會在第一次匯入時執行模組內**

在我們的專案中應該盡量避免出現迴圈/巢狀匯入,如果出現多個模組都需要共享的資料,可以將共享的資料集中存放到某乙個地方在程式出現了迴圈/巢狀匯入後的異常分析、解決方法如下(了解,以後盡量避免)

示範檔案內容如下

view code

編寫好的乙個python檔案可以有兩種用途:

一:指令碼,乙個檔案就是整個程式,用來被執行(比如你之前寫的模擬登入那個作業等)

二:模組,檔案中存放著一堆功能,用來被匯入使用

​python為我們內建了全域性變數__name__,

當檔案被當做指令碼執行時:name等於'main'

當檔案被當做模組匯入時:__name__等於模組名

​ifname== 'main':

view code

當你引用乙個模組時,不見得每次都可以import到:

上面的示例可以得知,引用模組也是按照一定規則進行引用的。

python中引用模組是按照一定的規則以及順序去尋找的,這個查詢順序為:先從記憶體中已經載入的模組進行尋找找不到再從內建模組中尋找,內建模組如果也沒有,最後去sys.path中路徑包含的模組中尋找。它只會按照這個順序從這些指定的地方去尋找,如果最終都沒有找到,那麼就會報錯。

記憶體中已經載入的模組->內建模組->sys.path路徑中包含的模組

在第一次匯入某個模組時(比如tbjx),會先檢查該模組是否已經被載入到記憶體中(當前執行檔案的命名空間對應的記憶體),如果有則直接引用(ps:python直譯器在啟動時會自動載入一些模組到記憶體中,可以使用sys.modules檢視)

如果沒有,直譯器則會查詢同名的內建模組

如果還沒有找到就從sys.path給出的目錄列表中依次尋找tbjx.py檔案。

需要特別注意的是:我們自定義的模組名不應該與系統內建模組重名。雖然每次都說,但是仍然會有人不停的犯錯

自定義模組

自定義模組 也就是我們自己寫的 1.配置模組說明檔案 npm init 就會生成乙個package.json的檔案 main index.js 我們的主檔案是index.js index.js是這個包的輸出檔案,即便刪除了package.json只要不改變index.js的檔名就沒事,一旦改了就會報...

自定義模組

匯入 拿工具箱 import import test test.func 1 避免寫重複 2 可以多次利用 3 拿來主義print locals import test print locals import test print test.name import test print test.f...

模組 簡介, 自定義模組

模組 拿來就用 節省開發時間 提公升效率 結構化,便於查詢 便於修改,便於維護 模組分類 內建模組,第三方模組 pypi第三方模組平台 自定義模組 乙個py檔案就是乙個模組 模組名是不需要加字尾名的 為了防止重複匯入,python優化,第一次匯入後會把模組名載入到記憶體,後續的import語句僅是對...