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

包是將有聯繫的模組組織在一起,即放到同一個文件夾下,並且在這個文件夾創建一個名字為__init__.py 文件,那麼這個文件夾就稱之為包(包就是一個文件夾)。

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

1、製作包

(1)創建包

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

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

    注意:新建包後,包內部會自動創建__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等

總結:

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

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