包的概念和匯入包的方法

2022-08-09 11:21:11 字數 3874 閱讀 3732

包的概念:包是一種通過使用『.模組名』來組織python模組命名空間的方式。通俗的講包就是一系列模組的集合體

具體的:包就是乙個包含有 __ init __ .py檔案的資料夾,所以其實我們建立包的目的就是為了用資料夾將檔案/模組組織起來

使用包的目的:包的本質就是乙個資料夾,那麼資料夾唯一的功能就是將檔案組織起來,而隨著模組越來越多,我們就需要用資料夾將模組檔案組織起來,以此來提高程式的結構性和可維護性

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

模組的載入順序:記憶體 => 內建 => sys.path(一系列自定義模組)

import sys

sys.path

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

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

'''我們可以自己往sys.path新增路徑

) 新增到環境變數最後,最後被查詢

sys.path.insert(

0, r'想匯入的模組的絕對路徑'

) 新增到指定索引,索引就決定了自定義模組的查詢順序

包以及包所包含的模組都是用來被匯入的,而不是被直接執行的。而環境變數都是以執行檔案為準的。

import time

第一次匯入:記憶體-

>內建-

>自定義,最終在自定義中找到,完成匯入,並在記憶體中快取模組的記憶體位址

import m1

print

(m1.num)

time.sleep(5)

#利用延遲把對應檔案m1刪除

再次匯入,從記憶體中就可以直接找到,即時當前檔案為刪除狀態,記憶體中的位址任然可以被引用

import m1 as mm1

print

(mm1.num)

'''

匯入模組的指令:

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

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

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

'''

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

迴圈匯入引發的問題:

兩個模組直接相互匯入,且相互使用其命名空間中的名字,但是有些名字沒有產生就使用,就出現了迴圈匯入問題。

m1.py檔案

import m2

x =10

print

(m2.y)

m2.py檔案

import m1

y =10

print

(m2.x)

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

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

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

注意點:

from匯入馬上會使用名字,極容易出現錯誤,建議迴圈匯入情況下,盡量使用import匯入。

import本質:通過查詢環境變數(sys.path)中的絕對路徑來完成匯入(右鍵執行該檔案,sys.path第乙個元素是當前資料夾路徑)。

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

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

import pk

'''pk資料夾

-- __init__.py

'''

導包過程中會完成一下三件是:

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

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

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

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

注意點:

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

2、在包 __ init __ .py 中不建議使用as起別名

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

在使用檔案中

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

import 包名.檔名 as 別名

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

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

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

# 在包的__init__檔案中

import 模組名 # 問題:所屬包不在環境變數,報錯

import 包名.模組名 # 問題:包所屬資料夾不在檔案變數,報錯

import 包名.模組名 as 別名 # 在外界:包名.模組名 | 包名.別名 都可以訪問

import 包名.模組名.名字 # 問題:導包語句.語法左側必須全部是包(資料夾)

外界import 包名

包名.名字 # 訪問的是__init__中的名字

包名.模組 # 訪問的模組這個位址

包名.模組.名字 # 訪問的模組中的名字

import 包名.模組

包名.模組 # 訪問的模組這個位址

包名.模組.名字 # 訪問的模組中的名字

from 包名 import 模組

模組 # 訪問的模組這個位址

模組.名字 # 訪問的模組中的名字

from 包名.模組 import 名字

名字 # 訪問的模組中的名字

沒有子包

1)

pk包 -

- __init__.py

-- 名字 a =10-

- pkm.py

-- 名字 b =20

在外界import pk

pk.a 訪問a

pk.b 訪問b

init管理檔案

a不需要操作

from

.pkm import b

有子包

1、pk包

-- __init__.py

sub子包

-- __init__.py

名字 x =10-

- subm.py

名字 y =

10 直接在外界訪問內部名字時

import pk

pk.x 訪問x

pk.y 訪問y

在pk的init管理檔案

from

.sub import x

from

.sub.subm import

2、pk包

-- __init__.py

sub子包

-- __init__.py

名字 x =10-

- subm.py

名字 y =

10 直接在外界訪問內部名字時

import pk

pk.sub.x 訪問x

pk.sub.y 訪問y

在pk的init管理檔案:要產生sub名字

from

.import sub =

> pk.sub

在sub的init管理檔案:要產生x,y名字

x不需要操作 =

> pk.sub.x

from

.subm import y =

> pk.sub.y

需要注意:

有相對匯入.語法的檔案都不能自執行

匯入模組 和 包

一 模組 模組一共三種 python標準庫 第三方模組 應用程式自定義模組 在cmd命令終端,檢視命令os 來自第三方 time模組來自第三方 模組兩種執行方式 1 用於啟動執行 2 用於被呼叫執行 key import module 將執行檔案 module 的目錄路徑插入到sys.path的第乙...

python 包 模組的概念 匯入與使用

how to define 模組 how to 使用模組 模組直接匯入 import module name module name.function.name module name.class name 若模組名稱直接以數字開頭,需要借助importlibimport importlib 匯入了...

日誌 包的匯入和引用

建立乙個包也會發生三件事 from import from import 通過這種方式不用設定 init 檔案 from aaa import m1 m1.func from aaa.bbb.m2 import func1 func1 from aaa.bbb import m2 m2.func1 ...