『無為則無心』Python函式 — 37、Python中的包

繁華似錦Fighting 發表於 2022-01-25
Python

包是將有聯絡的模組組織在一起,即放到同一個資料夾下,並且在這個資料夾建立一個名字為__init__.py 檔案,那麼這個資料夾就稱之為包(包就是一個資料夾)。

換句話說,包也是一個模組,是一個更高階的模組。當我們模組中程式碼過多時,或者一個模組需要被分解為多個模組時,這時就需要使用到包,普通的模組就是一個py檔案,而包是一個資料夾。引入了一個包,那包中的模組也能被引用了。

1、製作包

(1)建立包

[New] —> [Python Package] —> 輸入包名 —> [OK] —> 新建功能模組

  • [New] —> [Python Package]
    image
  • 輸入包名 —> [OK](或者回車)
    image
  • 可以看到專案目錄導航視窗中,看到我們建立的包和包中的__init__.py 檔案。
    image

    注意:新建包後,包內部會自動建立__init__.py檔案,這個檔案控制著包的匯入行為。

(2)在包內建立模組

1)新建包內模組:my_module1my_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檔案,相當於一個工具類。
  • 包:將有聯絡的模組組織在一起,即放到同一個資料夾下,方便控制管理。
  • 標準庫:官方定義好的,具有相關功能模組的集合。如ossys

總結:

這三個概念實際上都是模組,只不過是個體和集合的區別。

第三方庫:就是由其他的第三方機構,釋出的具有特定功能的模組。