一、包
1、什麼是包?
一系列模組的集合
2、有什麼用?
包通過資料夾來管理一系列功能相近的模組
3、包重點?
包中一定有乙個專門用來管理包中所有模組的檔案 __init__
4、什麼是包名?
包名是存放一系列模組的資料夾名字
5、包名有什麼用
包名(包物件)存放的是管理模組的那個檔案的位址,指向其全域性命名空間。
二、模組載入順序
1、模組的載入順序?
記憶體》內建》sys.path(自定義模組)
2、第一次匯入模組順序?
記憶體》內建》自定義 最終在自定義中找到完成匯入,並在記憶體中快取模組的記憶體位址
3、再次匯入模組順序?
從記憶體中就了可以直接找到,即時當前檔案為刪除狀態,記憶體中的位址仍可以被引用。
import sys
sys.path 環境變數:存放檔案路徑列表
#重點:預設列表中第乙個元素就是當前被執行檔案所在目錄
#可以自定義往sys.path中新增路徑
sys.path.insert(0,r『想匯入的模組的絕對路徑』) #新增到指定索引,索引就決定了模組查詢的順序
三、迴圈匯入
1.迴圈匯入導致的問題?
-- 匯入模組是要使用模組中的變數
-- 正常邏輯都是在檔案最上方先完成對模組的匯入,再在下方定義自身模組變數,以及使用匯入的模組中的變數
-- 由於匯入模組的特殊機制,第一次匯入模組會編譯執行匯入的模組,也就是會進入模組逐句執行模組內容,再次匯入只是使用記憶體中的名字
-- 就會出現下面的情況,m2在使用m1中的變數x,但變數x卻並未產生,這就出現了迴圈匯入問題
m1.py檔案
import m2
x = 10
print(m2.y)
m2.py檔案
import m1
y = 10
print(m2.x)
# 解決迴圈匯入問題:
延後匯入,一旦產生對方要使用的名字再去完成匯入對方。
1、from 匯入馬上回使用名字,極容易出現錯誤,建議迴圈匯入的情況下,使用import匯入
2、先提前產生名字,再匯入模組
3、在匯入邏輯放在函式中,將匯入的邏輯延後到函式的呼叫,呼叫在生產名字後即可。
重點:問題:from導包極容易出現迴圈匯入問題
解決:建議from匯入方式改用import匯入方式
四、導包完成的三項事
1、編譯執行包中的__init__.py檔案,會在包__pycache__中建立對應的pyc字尾的檔案
2、產生__init__.py檔案的全域性命名空間,用來存放__init__出現的名字。
3、產生包名指向__init__.py檔案的全域性命名空間 | 指定變數名指向包中指定名字
總結:包名為資料夾名,命名空間是__init__.py產生的。
五、使用包中模組中的名字:採用import匯入
建議:在包__init__檔案中不建議:
1、不建議使用import匯入模組
2、不建議使用as起別名
在使用檔案中
直接在要使用的資料夾中import一層層找到你想要的名字
import 包名.檔名 as 別名
#起完別名,原名不可以再使用
原名:包名.檔名==》包名.檔名.變數名
別名:別名==》別名.變數名
六、包中使用import匯入:絕對匯入
在包的__init__檔案中
import 模組名 #問題:所屬包不在環境變數,報錯
import 包名.模組名 #問題:包所屬資料夾不在檔案變數,報錯
import 包名.模組名 as 別名 #在外界:包名.模組 |包名.別名,都可以訪問
import 包名.模組名.名字 # 問題:導包語句.語法左側必須全部是包(資料夾)
# 外界
import 包名
包名.名字 # 訪問的是__init__中的名字
包名.模組 # 訪問的模組這個位址
包名.模組.名字 # 訪問的模組中的名字
import 包名.模組
包名.模組 # 訪問的模組這個位址
包名.模組.名字 # 訪問的模組中的名字
from 包名 import 模組
模組 # 訪問的模組這個位址
模組.名字 # 訪問的模組中的名字
from 包名.模組 import 名字
名字 # 訪問的模組中的名字
七、包中使用from匯入:相對匯入
# 沒有子包
''' 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 y
'''''' 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 第十六天
魔法方法總是被雙下劃線包圍 例如 init 注 魔法方法第乙個引數為cls 類方法 或者self 例項方法 其中 cls 代表乙個類名稱 self 代表乙個例項物件的名稱 基本方法 init self 構造器,當乙個例項被建立的時候呼叫的初始化方法 new cls 是在乙個物件例項化的時候所呼叫的第...
學習python 第十六天
流 i o 一 編碼 編碼明文 暗文 明文 暗文 解碼計算機只認識010101 ascii 0 127 ansi ascii加上拉丁文 gb2312 ascii加上7000多個漢字 前八位和後八位 127 gbk gb2312加上2萬多個漢字 前八位 127 unicode 國際通用 utf 8 推...
寒假第十六天
abs x 返回數字的絕對值,如abs 10 返回 10 ceil x 返回數字的上入整數,如math.ceil 4.1 返回 5 cmp x,y 如果 x y 返回 1,如果 x y 返回 0,如果 x y 返回 1 exp x 返回e的x次冪 ex 如math.exp 1 返回2.7182818...