1. 程式人生 > >python模組匯入import詳解.md

python模組匯入import詳解.md

目錄

一.什麼是模組

模組就好比是工具包,要想使用這個工具包中的工具(就好比函式),就需要匯入這個
模組。

模組的本質就是一個.py檔案,裡面包含已經封裝好的類、方法等。模組匯入也即是使用這個py檔案中的變數、方法。

程式碼執行到模組匯入位置時,會預先載入(執行)匯入的模組。

二.分類

1.按位置分

  • 常見的內建模組
    python原始碼之中內建的模組,常見的有 time、random、os、mutilprocessing等
    http://python.jobbole.com/86332/
  • 外部安裝的模組
    比如python寫遊戲的pygame模組、連線mysql資料庫的pymysql模組等。
    一般匯入方式:
    1. pip install 模組名(虛擬環境使用較多)
    2. pycharm的setting --> plugins

注意:使用from匯入變數,而那些變數碰巧和作用域中現有的變數同名,本地變數就會被悄悄地覆蓋掉

2.按功能分

例如:時間模組time帶有多個時間方面的函式,而random模組主要是實現隨機功能。

三.模組的匯入方式

python語言中主要有三種方式

1.import

有5種形式:
import 模組(import 模組.方法 錯誤)
import 模組 as 別名
from 模組 import 方法(變數)
from 模組 import 方法(變數) as 別名
from 模組 import *

注意:模組名一般為檔名,且符合python識別符號規則(由數字字母下劃線組成,數字不能開頭)

import time
a = time.time()
print(a)

2. _import_

# 引數為模組名
module = __import__("time")
print(module.time())

3.getattr


# 引數一為模組物件,引數二為模組方法
module_fun = getattr(time, 'time')
print(module_fun())

使用案例

# 框架思想

import sys

action_list = sys.argv  # 得到一個列表

moudle = __import__(action_list[
1]) fun = getattr(moudle, action_list[2]) print(fun())

四.模組的儲存位置

1.常見系統路徑

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

import sys

print(sys.path)

#結果
[
'',  #當前路徑
'/home/yz/desktop/test', #專案路徑
'/usr/lib/python35.zip', 
'/usr/lib/python3.5', 
'/usr/lib/python3.5/plat-x86_64-linux-gnu', 
'/usr/lib/python3.5/lib-dynload', 
'/usr/local/lib/python3.5/dist-packages', 
'/usr/lib/python3/dist-packages'
]

2.查詢某個模組的路徑

 import random
 random.__file__
 #結果
'/usr/lib/python3.5/random.py'

3.更改模組路徑

在這裡插入圖片描述

注意:路徑的修改只對當前檔案有效

五.實際應用

1. 重新載入

在終端命令列之中,A匯入模組B,當B修改之後,A仍然使用B被修改之前的程式碼。
這個時候就需要重新匯入。使用reload

form importlib import reload
reload(模組名)

2. 淺拷貝匯入

“import 模組”屬於淺拷貝,如果A修改了匯入的B變數,此時c匯入該B變數還是未修改的B.
在這裡插入圖片描述

3. 迴圈匯入

circular import異常:A匯入B,B匯入C,而C又匯入A,這樣構成了一個死迴圈。
解決:
1. 在函式方法內部匯入B,錯開匯入程式碼的執行順序
2. A、B©檔案合併或者找一個D文件來分離A/B/C。

六. 模組與包

清楚模組與包的區別!
1.模組:單個的py檔案
2.包:含有__init__.py檔案的資料夾。裡面一般有多個.py檔案。

注意:如果包的__init__.py檔案是空的,則 “from 包 import * ” 是無效的。

七. __all__和__name__

  1. 對於 ‘from 模組 import *’:A檔案裡有一個列表__all__=[ ],那麼其它檔案只能匯入A檔案中列表__all__的元素限定的變數。
  2. _name_
if __name__ == '__main__'

在A檔案中,其屬性__name__的值是_main_;而在其它檔案中,匯入的A.__name__的值是A的檔案(模組)名。