包是將有聯絡的模組組織在一起,即放到同一個資料夾下,並且在這個資料夾建立一個名字為__init__.py
檔案,那麼這個資料夾就稱之為包(包就是一個資料夾)。
換句話說,包也是一個模組,是一個更高階的模組。當我們模組中程式碼過多時,或者一個模組需要被分解為多個模組時,這時就需要使用到包,普通的模組就是一個py
檔案,而包是一個資料夾。引入了一個包,那包中的模組也能被引用了。
1、製作包
(1)建立包
[New] —> [Python Package] —> 輸入包名 —> [OK] —> 新建功能模組。
- [New] —> [Python Package]
- 輸入包名 —> [OK](或者回車)
- 可以看到專案目錄導航視窗中,看到我們建立的包和包中的
__init__.py
檔案。
注意:新建包後,包內部會自動建立
__init__.py
檔案,這個檔案控制著包的匯入行為。
(2)在包內建立模組
1)新建包內模組:my_module1
和 my_module2
[new] —> [Python File] —> 輸入檔名
2)模組內程式碼如下
# my_module1
print(1)
def info_print1():
print('my_module1')
# my_module2
print(2)
def info_print2():
print('my_module2')
2、匯入包
方法一
# 匯入
import 包名.模組名
# 呼叫包中模組的功能
包名.模組名.目標
示例:
# 匯入包中模組--包名.模組名
import my_package.my_module1
# 呼叫功能--包名.模組名.功能()
my_package.my_module1.info_print1()
方法二
# 匯入包中功能
from 包名 import * 或者 功能名1、2、3...
# 呼叫模組功能
模組名.目標
編輯__init__.py
檔案中新增__all__ = []
__all__ = ['my_module1']
示例:
# 導包
from my_package import *
# 呼叫__all__列表中定義模組的功能。
my_module1.info_print1()
注意:
必須在
__init__.py
檔案中新增__all__ = []
,控制允許匯入的模組列表。如果沒有定義在
__all__
列表中的模組,無法匯入到指定檔案中。
3、關於__pycache__
資料夾說明
在包中還有一個叫__pycache__
的資料夾,__pycache__
是模組的快取資料夾。
Python程式碼在執行前,需要被解析器先轉換為機器碼,然後再執行,所以我們在使用模組(包)時,也需要將模組的程式碼先轉換為機器碼然後再交由計算機執行,而為了提高程式執行的效能,Python會在編譯過一次以後,將程式碼儲存到一個快取檔案中,這樣在下次載入這個模組(包)時,就可以不再重新編譯而是直接載入快取中編譯好的程式碼即可(避免重複解釋)。
__pycache__
資料夾可以刪除,但是以後在呼叫包中的模組時,還會重新解釋模組,還會把直譯器處理完的程式碼儲存在__pycache__
資料夾中。
4、Python標準庫
為了實現開箱即用的思想,Python中為我們提供了許多模組的標準庫,在這個標準庫中,有很多很強大的模組,提供我們可以直接使用,並且標準庫會隨Python的安裝一同安裝。
模組、包和標準庫的關係
- 模組:就是一個
.py
檔案,相當於一個工具類。 - 包:將有聯絡的模組組織在一起,即放到同一個資料夾下,方便控制管理。
- 標準庫:官方定義好的,具有相關功能模組的集合。如
os
和sys
等
總結:
這三個概念實際上都是模組,只不過是個體和集合的區別。
第三方庫:就是由其他的第三方機構,釋出的具有特定功能的模組。