1. 程式人生 > 實用技巧 >spring boot 配置攔截器 interceptor

spring boot 配置攔截器 interceptor

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
  1. 產生一個名稱空間

  2. 執行包下的__init__.py檔案,將執行過程中產生的名字都丟到1的名稱空間中

  3. 在當前執行檔案的名稱空間中拿到一個名字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__.pysys.path