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')
  • 匯入模組的檔案程式碼
from my_module1 import *
testA()
testB()

二. 包

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

2.1 製作包

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

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

2.1.1 快速體驗

  1. 新建包mypackage
  2. 新建包內模組:my_module1my_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 *
模組名.目標

2.2.2.1 體驗

from my_package import *

my_module1.info_print1()

三. 總結

  • 匯入模組方法
import 模組名

from 模組名 import 目標

from 模組名 import *
  • 匯入包
import 包名.模組名

from 包名 import *
  • __all__ = [] :允許匯入的模組或功能列表