python之包的概念

2021-09-17 18:18:13 字數 3202 閱讀 5070

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

import sys

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

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

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

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

匯入模組的指令:

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

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

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

模組之間會出現迴圈匯入的問題,如:m1.py中匯入了m2,m2.py中又匯入了m1

# m1.py檔案

import m2

x = 10

print(m2.y)

# m2.py檔案

import m1

y = 10

print(m2.x)

迴圈匯入的問題:

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

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

-- 由於匯入模組的特殊機制,第一次匯入模組時會編譯執行匯入的模組,也就是進入模組逐句執行模組內容,再次匯入只是使用記憶體中的名字,就會出現下面的情況,m2在使用m1中的變數x,但變數x卻並未產生,這就產生了迴圈匯入問題

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

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

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

示例:

def fn():

import mm4

print(mm4.arg)

num = 66666 # 要使用的變數

fn() # 之後呼叫導包邏輯

重點:

問題: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 別名

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

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

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

在包的__init__檔案中

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

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

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

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

import 包名

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

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

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

import 包名.模組

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

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

from 包名 import 模組

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

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

from 包名.模組 import 名字

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

沒有子包

①pk包

-- __init__.py

-- 名字 a = 10

-- pkm.py

-- 名字 b = 20

在外界import pk

pk.a 訪問a

pk.b 訪問b

init管理檔案

a不需要操作

from .pkm import b

有子包①

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 y

②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包的概念

python的包就是乙個資料夾 這個資料夾與普通資料夾的區別在於他必須包含乙個 init py的檔案 這個檔案可以包含 也可以沒有內容 只是用於標識乙個包 這個檔案本身是乙個模組 這個模組的名字是資料夾的名字 而不是 包名.init 而是包的名字 即這個資料夾的名字 命名空間 import只能匯入模...

python包的概念

1 python程式由包 package 模組 module 和函式組成。包是由一系列模組組成的集合。模組是處理某一類問題的函式和類的集合。2 包就是乙個完成特定任務的工具箱。3 包必須含有乙個 init py檔案,它用於標識當前資料夾是乙個包。4 python的程式是由乙個個模組組成的。模組把一組...

Python模組和包的概念

模組 模組是python組織 的基本方式。乙個python指令碼可以單獨執行,也可以匯入到另乙個指令碼中執行,當指令碼被匯入執行時,我們將其稱為模組 module 所有的.py檔案都可以作為乙個模組匯入。模組名與指令碼的檔名相同。模組是乙個可以匯入的python指令碼檔案。例如我們編寫了乙個名為he...