一、包的認識
包通過文件夾來管理一系列功能相近的模塊。
包:一系列模塊的集合體,包中一定有一個專門用來管理包中所有模塊的文件__init__.py
包名:存放一系列模塊的文件夾名字,存放的是管理模塊的那個文件的地址,指向其全局名稱空間
二、包的使用
(一)、包的導入
import 本質是通過查找環境變量(sys.path)中的絕對路徑來完成導入
導包完成的三件事
- 編譯執行包中的__init__.py文件,會在包中__pycache__創建對應的pyc文件
- 產生__init__.py文件的全局名稱空間,用來存放__init__出現的名字
- 產生包名指向__init__.py文件的全局名稱空間 | 指定變量名指向包中指定名字
注:包名爲文件夾名,名稱空間是__init__.py產生的
使用包中模塊中的名字
文件結構:
module文件夾
-- __init__.py
-- m1.py
test.py文件
import module
# 在該文件中使用包
1.包名.X ——就是問包下的__init__.py
文件要一個名字,__init__.py
文件中產生的普通名字可以直接使用
__init__.py
x = 10
test.py
print(module.x)
2.包下的模塊,要通過 包名.模塊名 間接使用,直接import 模塊名(那個py文件)是錯誤的
①在__init__.py文件中import 模塊名
m1.py
num = 10
__init__.py
import module.m1
test.py
print(module.m1.num)
②from 包名(執行文件所在文件夾下能找到的情況下)import 模塊名
(二)、使用包中模塊中的名字:採用import導入
注意點:
1.在包__init__.py中不建議使用import導入
2、在包__init__.py中不建議使用as起別名
總結:不建議__init__.py中採用import管理名字 ==> 空着不寫
在使用文件中
直接在要使用的文件中用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
注:有相對導入.語法的文件都不能自執行