python入門指南_27-模組和包
課程:模組和包
目標
- 瞭解模組
- 匯入模組
- 製作模組
__all__
- 包的使用方法
一. 模組
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解析器對模組位置的搜尋順序是:
- 當前目錄
- 如果不在當前目錄,Python則搜尋在shell變數PYTHONPATH下的每個目錄。
- 如果都找不到,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')
- 匯入模組的檔案程式碼
from my_module1 import *
testA()
testB()
二. 包
包將有聯絡的模組組織在一起,即放到同一個資料夾下,並且在這個資料夾建立一個名字為__init__.py
檔案,那麼這個資料夾就稱之為包。
2.1 製作包
[New] — [Python Package] — 輸入包名 — [OK] — 新建功能模組(有聯絡的模組)。
注意:新建包後,包內部會自動建立__init__.py
檔案,這個檔案控制著包的匯入行為。
2.1.1 快速體驗
- 新建包
mypackage
- 新建包內模組:
my_module1
和my_module2
- 模組內程式碼如下
# 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 *
模組名.目標
2.2.2.1 體驗
from my_package import *
my_module1.info_print1()
三. 總結
- 匯入模組方法
import 模組名
from 模組名 import 目標
from 模組名 import *
- 匯入包
import 包名.模組名
from 包名 import *
__all__ = []
:允許匯入的模組或功能列表