4 18 4 19 模組與包

2021-09-19 11:48:26 字數 3869 閱讀 8293

模組:一系列功能的集合體

定義模組:建立乙個py檔案就是乙個模組,該py檔名就是模組名。

使用模組:在要使用模組的檔案中,通過import模組名來匯入模組。

import moudle

#1.編譯執行模組對應的py檔案,形成對應的pyc檔案

#2.產生該模組自己的全域性命名空間

#3.在使用該模組的全域性命名空間中產生乙個名字(匯入的模組名)

注:1.每乙個檔案都會產生自己的全域性命名空間

2.多次匯入,只會編譯執行模組一次,將其載入到記憶體,之後直接在記憶體中讀取名字直接引用

優點:1.從檔案級別組織**,是共同性的功能能統一管理。

2.可以使用系統或第三方模組,來提高開發效率

# 起別名

通過as關鍵字可以給模組起別名:模組名一旦起別名,原模組名就不能使用了。

1.可以簡化模組名

2.可以統一功能

1.

import nnnnnn2 as my_n2

print(my_n2.num)

2.cmd = input('資料庫選擇1:mysql | 2:oracle ')

if cmd == '1':

import mysql as db

else:

import oracle as db

db.excuse()

from匯入

from模組名  import 名字1,名字2,。。,名字n

指名道姓匯入模板中所有想匯入的名字。

from 模組名 import  *

匯入的是模組中__all__這個列表

1.系統預設該列表不會收錄_開頭的名字。

2.可以自定義__all__列表來規定外界通過*可以匯入的名字

不建議直接匯入*,因為可讀性差,且極容易出現變數重名

from 模組名 import *   # 模組中有名字a

a =  20   # 可以使用模組中的a

結論: 模組中的 a 就被覆蓋了,且**上還不能直接看出

起別名from 模組名 import 名字1 as 別名1,..............,名字n as 別名n

自執行與模組的區別

__name__:

1.在py檔案作為模組被使用時,__name__為模組名

2.在py檔案自執行時,__name__為字串 '__main__'

print('共有邏輯')

if __name__ =='__main__':

# 所有自執行的邏輯

print('m6: 我是自執行的')

a = 10 # 產生的是全域性的名字

else:

# 所有模組的邏輯

print('m6: 我被匯入執行')

print(a) # 會報錯:走else就不可能走if,所以a壓根沒產生

總結:

模組的概念:一系列功能的集合體

為什麼要使用模組:使用模組後的優點:1.從檔案角度考慮** 2.拿來主義,提高開發效率

py中實現模組的方式:4種,重點:py檔案

定義模組:新建乙個py檔案:檔名就是模組名,盡量採用全英文,也可使用數字加下劃線的方式

使用模組:可以不用起別名,但一旦起別名,原名就不能在使用

----import 模組名 as 別名

----from 模組名 import 名字 as 別名

自執行檔案與模組區分:__name__

包通過資料夾來管理一系列功能相近的模組

包:一系列模組的集合體

重點:包中一定有乙個專門用來管理包中所有模組的檔案

包名:存放一系列模組的資料夾名字

包名存放的是管理模組的那個檔案的位址,指向其全域性命名空間。

模組的載入順序:

記憶體 => 內建 => sys.path (一系列自定義模組)

import sys

sys.path # 環境變數:存放檔案路徑的列表

重點:預設列表第乙個元素就是當前被執行檔案所在的目錄

可以自定義往sys.path新增路徑

sys.path.insert(0, r'想匯入的模組的絕對路徑')  # 新增到指定指定索引,索引決定自定義模組的查詢順序。

# 模組匯入的執行流程

匯入模組的指令:

——相對於函式名()呼叫函式體,函式呼叫會進入函式體,從上至下逐句解釋執行函式體**

——匯入模組,會進入模組檔案,從上至下逐句解釋執行模組檔案**

——如果在模組中又會遇到匯入其他模組,會接著進入匯入的模組,從上至下逐句解釋執行檔案**,以此類推。

迴圈匯入

模組之間出現環狀匯入,如:m1.py 中匯入了m2, m2.中又匯入了m1

迴圈匯入的問題:

——匯入模組是要使用模組中的變數

——正常邏輯都是在檔案最上方先完成對模組的匯入,再在下方定義自身模組變數,以及使用匯入的模組中的變數

——由於匯入模組的特殊機制,第一次匯入模組會編譯執行匯入的模組,也就是會進入模組逐句執行模組內容,再次匯入只是使用記憶體中的名字

——就會出現下面情況,m2在使用m1中的變數x,但變數x卻並未產生,這就出現了迴圈匯入問題

解決迴圈匯入的問題:延後匯入

1.將迴圈匯入對應包要使用的變數提前定義,再匯入響應的包

2.將導包的路徑放到函式體中,保證存放導包邏輯的函式呼叫在要使用的變數定義之後。

重點:問題:from導包極容易出現迴圈匯入問題

解決:建議from匯入方式改用import匯入方式

包的匯入:

import本質:通過查詢環境變數(sys.path)中的絕對路徑來完成匯入

導包:1.保證包所在資料夾在環境變數中

2.匯入的資料夾名就是包名

導包完成的三項:

1.編譯執行包中的__init__.py檔案,會在包中__pycache__建立對應的pyc檔案

2.產生__init__.py檔案的全域性命名空間,用來存放__init__出現的名字

3.產生包名指向__init__.py檔案的全域性命名空間 | 指定變數名指向包中指定名字

總結:包名為資料夾名,命名空間是__init__.py產生的

## 使用包中模組中的名字:採用import匯入

注意點:

1.在包__init__.py中不建議使用import匯入

2.在包__init__.py中不建議使用as起別名

總結:不建議__init__.py中採用import管理名字 ==> 空著不寫

在使用檔案中:

直接在要使用的檔案中用import一層層找你要的名字

import 包名.檔名 as 別名

# 起完別名,原名不可以再使用

原名:包名.檔名 => 包名.檔名.變數名

別名:別名 => 別名.變數名

1.__init__.py檔案中產生的普通名字可以直接使用

2.管理的模組**現的名字,要通過包名.模組名 間接使用

包的巢狀

重點:導包.語法,在所有點左側都必須是包

import 父包.子包

import 父包.子包.模組

導包的兩種方式

絕對匯入:通過sys.path方式來實現

將對應的資料夾新增至sys.path中,就可以直接匯入對應資料夾下的模組

相對匯入:通過包內.語法來實現

# 相對匯入是存在於包內的語法

# .代表當前資料夾

# ..代表上一級資料夾

# 存在.語法的檔案,不能作為執行檔案

python模組與包

路徑修改 命令列怎麼檢視路徑,修改路徑 列印當前搜尋路徑 import sys sys.path sys.path import os os.getcwd os.chdir c www 模組實現構建模組的初衷就是將一些同類的東西進行打包,以免汙染全域性空間,在python的模組裡,對需要隱藏的屬性和...

python 模組與包

模組與包 1.什麼是模組 在 python 中,乙個.py檔案就稱之為乙個模組 module 模組的優點 大大提高了 的可維護性 編寫 不必從零開始。當乙個模組編寫完畢,就可以被其他地方引用 2.匯入模組的幾種方式 4.模組的分類 1 內建模組 os,sys,dnspython,socket,tim...

python包與模組

python模組 py檔案就是模組 1.在同乙個工作目錄 呼叫其他模組裡面的方法一 import module 呼叫 module.function 注意 此時import module時,在執行當前 時,會先執行被import的module裡的 import module as m1 別名,類似w...