學習記錄——react的css模組化
阿新 • • 發佈:2020-12-12
1. 包的介紹
什麼是包?
隨著模組數目的增多,把所有模組不加區分地放到一起也是極不合理的,於是Python為我們提供了一種把模組組
織到一起的方法,即建立一個包。包就是一個含有__init__.py
檔案的資料夾,資料夾內可以組織子模組或子
包,例如
pool/ #頂級包
├── __init__.py
├── futures #子包
│ ├── __init__.py
│ ├── process.py
│ └── thread.py
└── versions.py #子模組
[一句話]
包就是一個包含有__init__.py
[強調]
py2下想要匯入包,包下面必須要有__init__.py檔案,否則匯入報錯
py3下的包沒有__init__.py檔案,匯入包也不會報錯,但是你無法取到名字
2. 包的使用
為什麼使用包
當你作為模組的設計者,模組的功能越寫越多的時候,用包能夠分檔案的更好的管理,拓展自己的功能
但是在使用者層面上不更改使用方法
2.1 匯入包與__init__.py
[匯入包發生的三件事]
import mmm
-
產生一個名稱空間
-
執行包下的
__init__.py
檔案,將執行過程中產生的名字都丟到1的名稱空間中 -
在當前執行檔案的名稱空間中拿到一個名字mmm,mmm指向1的名稱空間mmm中的名字統統來自
__init__.py
的名稱空間,或者通俗的說,mmm指向的就是__init__.py
的名稱空間
也就是說匯入包時並不會匯入包下所有的子模組與子包
[強調]
1.關於包相關的匯入語句也分為import和from ... import ...兩種,但是無論哪種,無論在什麼位置,在匯入時都必須遵循一個原則:凡是在匯入時帶點的,點的左邊都必須是一個包,否則非法。可以帶有一連串的點,如import 頂級包.子包.子模組,但都必須遵循這個原則。但對於匯入後,在使用時就沒有這種限制了,點的左邊可以是包,模組,函式,類(它們都可以用點的方式呼叫自己的屬性)。 2、包A和包B下有同名模組也不會衝突,如A.a與B.a來自倆個名稱空間 3、import匯入檔案時,產生名稱空間中的名字來源於檔案,import 包,產生的名稱空間的名字同樣來源於檔案,即包下的__init__.py,匯入包本質就是在匯入該檔案
2.2 絕對匯入和相對匯入
針對包內的模組之間的匯入有兩種方式
[絕對匯入]
# 以頂級包為起始
# mmm下的__init__.py
from mmm.m1 import f1
[相對匯入]
# .代表當前檔案所在的目錄,..代表當前目錄的上一級目錄,依此類推
# 僅限於包內使用,不能跨出包(包內模組之間的匯入,推薦使用相對匯入)
# mmm下的__init__.py
from ..m1 import f1
import也能使用絕對匯入,匯入過程中同樣會依次執行包下的__init__.py,只是基於import匯入的結果,使用時必須加上該字首
[強調]
1. 相對匯入不能跨出包,所以相對匯入僅限於包內模板彼此之間鬧著玩
2. 而絕對匯入是沒有任何限制的.所以絕對匯入是一種通用的匯入方式
[總結]
無論是哪種匯入方式,如果你想要使用者能夠使用你包裡面所有檔案(模組)的功能,那就必須在包下面的
__init__.py
檔案匯入所有檔案(模組)裡面的名字
2.3 from 包 import *
在使用包時同樣支援from mmm.m1 import *
,毫無疑問代表的是futures下__init__.py
中所有的名
字,通用是用變數__all__
來控制*
代表的意思
#mmm下的__init__.py
__all__ = ['f1',]
導包中的sys.path
在包的匯入中和模組一樣,查詢名字的順序也是從sys.path
這個列表中找,但是注意是執行檔案的sys.path
不是包裡面的__init__.py
的sys.path