1. 程式人生 > 實用技巧 >【Python】模組和包

【Python】模組和包

模組和包

一. 模組

Python 模組(Module),是一個 Python 檔案,以 .py 結尾,包含了 Python 物件定義和Python語句。

模組能定義函式,類和變數,模組裡也能包含可執行的程式碼。

1.1. 匯入模組

1.1.1 匯入模組的方式

  • import 模組名
  • from 模組名 import 功能名
  • from 模組名 import *
  • import 模組名 as 別名
  • from 模組名 import 功能名 as 別名

1.1.2 匯入方式詳解

1.1.2.1 import

語法

# 1. 導⼊模組
import 模組名
import 模組名1, 模組名2...

# 2. 調⽤功能
模組名.功能名()

體驗

import math
print(math.sqrt(9)) # 3.0
1.1.2.2 from..import..

語法

from 模組名 import 功能1, 功能2, 功能3...

體驗

from math import sqrt
print(sqrt(9))
1.1.2.3 from .. import *
語法
from 模組名 import *

體驗

from math import *
print(sqrt(9))
1.1.2.4 as定義別名

語法

# 模組定義別名
import 模組名 as 別名

# 功能定義別名
from 模組名 import 功能 as 別名

體驗

# 模組別名
import time as tt

tt.sleep(2)
print('hello')

# 功能別名
from time import sleep as sl
sl(2)
print('hello')

1.2 製作模組

在Python中,每個Python檔案都可以作為一個模組,模組的名字就是檔案的名字。也就是說自定義模組名必須要符合識別符號命名規則。

1.2.1 定義模組

新建一個Python檔案,命名為 my_module1.py ,並定義 testA 函式。

def testA(a, b):
    print(a + b)

1.2.2 測試模組

在實際開中,當一個開發人員編寫完一個模組後,為了讓模組能夠在專案中達到想要的效果,這個開發人員會自行在py檔案中新增一些測試資訊.,例如,在 my_module1.py 檔案中新增測試程式碼。

def testA(a, b):
    print(a + b)

testA(1, 1)

此時,無論是當前檔案,還是其他已經匯入了該模組的檔案,在執行的時候都會自動執行 testA 函式的呼叫。

解決辦法如下:

def testA(a, b):
    print(a + b)

# 只在當前⽂件中調⽤該函式,其他導⼊的⽂件內不符合該條件,則不執⾏testA函式調⽤
if __name__ == '__main__':
    testA(1, 1)

1.2.3 呼叫模組

import my_module1
my_module1.testA(1, 1)

1.2.4 注意事項`

如果使用 from .. import .. 或 from .. import * 匯入多個模組的時候,且模組內有同名功能。當呼叫這個同名功能的時候,呼叫到的是後面匯入的模組的功能。

體驗

# 模組1程式碼
def my_test(a, b):
    print(a + b)

# 模組2程式碼
def my_test(a, b):
    print(a - b)
 
# 導⼊模組和調⽤功能程式碼
from my_module1 import my_test
from my_module2 import my_test

# my_test函式是模組2中的函式
my_test(1, 1)

1.3 模組定位順序

當匯入一個模組,Python解析器對模組位置的搜尋順序是:

  1. 當前目錄
  2. 如果不在當前目錄,Python則搜尋在shell變數PYTHONPATH下的每個目錄。
  3. 如果都找不到,Python會察看預設路徑。UNIX下,預設路徑一般為/usr/local/lib/python/模組搜尋路徑儲存在system模組的sys.path變數中。變數裡包含當前目錄,PYTHONPATH和由安裝過程決定的預設目錄。

注意

  • 自己的檔名不要和已有模組名重複,否則導致模組功能無法使用
  • 使用from 模組名 import 功能 的時候,如果功能名字重複,呼叫到的是最後定義或匯入的功能。

1.4 all

如果一個模組檔案中有 all 變數,當使用 from xxx import * 匯入時,只能匯入這個列表中的元素。

my_module1模組程式碼

__all__ = ['testA']

def testA():
    print('testA')

def testB():
    print('testB') 123456789

匯入模組的檔案程式碼

from my_module1 import *
testA()
testB()

二. 包

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

2.1 製作包

[New] — [Python Package] — 輸入包名 — [OK] — 新建功能模組(有聯絡的模組)。

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

2.1.1 快速體驗

  1. 新建包 mypackage
  2. 新建包內模組: my_module1 和 my_module2
  3. 模組內程式碼如下
# my_module1
print(1)

def info_print1():
    print('my_module1')
# my_module2
print(2)

def info_print2():
    print('my_module2')

2.2 匯入包

2.2.1 方法一

import 包名.模組名
包名.模組名.目標
2.2.1.1 體驗
import my_package.my_module1
my_package.my_module1.info_print1()

2.2.2 方法二

注意:必須在 init.py 檔案中新增 all = [] ,控制允許匯入的模組列表。

from 包名 import *
模組名.目標

123456
123456

123

123

2.2.2.1 體驗
from my_package import *
my_module1.info_print1()