1、模塊簡介html
在實際開發中咱們不可能不用到系統的標準模塊,或第三方模塊。 若是想實現與時間有關的功能,就須要調用系統的time模塊。若是想實現與文件和文件夾有關的操做,就須要要用到os模塊。python
每個 Python 腳本文件均可以被當成是一個模塊。模塊以磁盤文件的形式存在。當一個模塊變得過大,而且驅動了太多功能的話,就應該考慮拆一些代碼出來另外建一個模塊。模塊裏的代碼能夠是一段直接執行的腳本,也能夠是一堆相似庫函數的代碼,從而能夠被別的模塊導 入(import)調用。模塊能夠包含直接運行的代碼塊、類定義、 函數定義或這幾者的組合。 app
推薦全部的模塊在Python模塊的開頭部分導入。並且最好按照這樣的順序:函數
Python標準庫模塊spa
Python第三方模塊操作系統
應用程序自定義模塊設計
import關鍵字code
在Python中用關鍵字import來引入某個模塊,好比要導入模塊time,就能夠在文件最開始的地方用import time來引入xml
import module1 htm
import module2[
......
import moduleN]
或者:import module1[, module2[,... moduleN]]
在調用模塊中的函數時,必須加上模塊名調用,由於可能存在多個模塊中含有相同名稱的函數,此時,若是隻是經過函數名來調用,解釋器沒法知道到底要調用哪一個函數。爲了不這樣的狀況,調用函數時,必須加上模塊名.
如:模塊名.函數名
from…import
Python的from語句讓你從模塊中導入一個指定的部分到當前命名空間中。
如:from modname import name1[, name2[, ... nameN]]
要導入模塊time的sleep函數,使用以下語句
from time import sleep
使用這種方式導入,不會整個模塊導入到當前命名空間,它只會將import的內容導入。
from…import *
導入一個模塊的全部內容也可使用from…import*。
如:from modname import*
擴展import語句(as)
有時候你導入的模塊名稱已經在你的程序中使用了, 或者你不想使用現有的名稱。可使用一個新的名稱替換原始的名稱。。
如:import pandas #原始的名稱
import pandas as pd #使用as從新命名
''' import 模塊名 導入整個模塊 經過模塊名.方法名 調用 ''' # import time # print('start') # time.sleep(5) # print('stop') ''' from 模塊名 import 函數名 從指定的模塊中導入指定的部分 ''' # from time import sleep # print('start') # sleep(5) # print('stop') #導入模塊中的全部內容 # from math import * # print(ceil(1.1))#向上取整 # print(floor(1.1)) #給導入的模塊取別名 # import math as m # print(m.ceil(1.2)) # print(m.floor(1.2)) # from math import ceil as c #不建議使用 # print(c(1.2))
2、模塊製做
跨目錄模塊調用
若是調用文件與被調用文件在一個目錄下面,則能夠很是方便地調用。那麼若是被調用的文件與調用文件不在同一目錄下的調用
定位模塊1
當你導入一個模塊,Python解析器對模塊位置的搜索順序是:
1.當前目錄
2.若是不在當前目錄,Python則搜索在環境變量PYTHONPATH下的每一個目錄
3.若是都找不到,Python會察看默認路徑。UNIX下,默認路徑通常爲/usr/local/lib/python/
4.模塊搜索路徑存儲在system模塊的sys.path變量中。變量裏包含當前目錄,PYTHONPATH和由安裝過程決定的默認目錄。
(sys模塊用於提供對python解釋器的相關操做。)
定位模塊2
因此若是當前路徑或 PythonPATH中存在與標準module一樣的module,則會覆蓋標準module。也就是說,若是當前目錄下存在xml.py,那麼在執行import xml時,導入的是當前目錄下的module,而不是系統標準的xml.py。
''' 自定義模塊 ''' # import test #引入同級目錄中的test模塊 # print(test.test_add(2,3)) # from test import test_add # print(test_add(2,3)) ''' 跨模塊引入 ''' # import study.test2 #模塊名.函數名 # print(study.test2.test2_add(2,3)) # from study import test2 # print(test2.test2_add(2,3)) # from study.test2 import test2_add # print(test2_add(2,3)) ''' 跨模塊引入2 ''' # import sys #查看路徑變量 # print(sys.path) #添加目標路徑 到當前環境中(重點) # sys.path.append('..\\') #返回上一級目錄 # print(sys.path) # import msg.send # msg.send.sendMsg() # from msg import send,recv # send.sendMsg() # recv.recvMsg() # from msg import math #引入自定義的模塊 # print(math.ceil(1.2)) # print(math.floor(1.2)) # math.getInfo() #覆蓋了標準模塊
3、dir()函數與標準模塊
dir()函數一個排好序的字符串列表,內容是一個模塊裏定義過的名字。 返回的列表容納了在一個模塊裏定義的全部模塊,變量和函數。
查看:dir(list)
標準模塊
Python 自己帶着一些標準的模塊庫,可參考 http://www.cnblogs.com/ribavnu/p/4886472.html
有些模塊直接被構建在解析器裏,這些雖然不是一些語言內置的功能,可是他卻能很高效的使用,甚至是系統級調用也沒問題。這些組件會根據不一樣的操做系統進行不一樣形式的配置,好比 winreg (Windows註冊表訪問)這個模塊就只會提供給 Windows 系統。應該注意到這有一個特別的模塊 sys ,它內置在每個 Python 解析器中。
4、包
包是一種管理 Python 模塊命名空間的形式,採用"點模塊名稱"。好比一個模塊的名稱是 A.B, 那麼他表示一個包 A中的子模塊B
目錄中只有包含一個叫作__init__.py的文件纔會被認做是一個包
在導入包的時候,Python會從sys.path中的目錄來尋找這個包中包含的子目錄
模塊在包裏
導入包
現有兩個模塊功能有些聯繫,因此將其放到同一個文件夾下,一個文件中的類繼承另外一個問文件中的類。
使用import文件.模塊的方式導入
import recvmsg
recvmsg.add()
使用from文件夾import模塊的方式導入
from recvmsg import *
add()
注意:必須包含__init__.py文件,才被認做是一個包
建立__init__.py
目錄中只有包含了叫作__init__.py的文件,才能被程序認做是包,模塊才能被導入成功。如今咱們就在msg文件夾下建立一個__init__.py文件,而且必定要在文件中寫入__all__
__init__.py 控制着包的導入行爲。若是__init__.py文件爲空的話,僅僅是把這個包導入,不會導入包中的模塊。__init__.py中的__all__變量,是用來控制from包名import * 時導入的模塊。
能夠在__init__.py中編寫其餘內容,在導入時,這些編寫的內容就會被執行。
能夠在__init__.py中向sys.path添加當前被調用模塊路徑。
__all__總結
1.編寫Python代碼(不建議在__init__中寫python模塊,能夠在包中在建立另外的模塊來寫,儘可能保證__init__.py簡單)
2.模塊中不使用__all__屬性,則導入模塊內的全部公有屬性,方法和類 。 模塊中使用__all__屬性,則表示只導入__all__中指定的屬性,所以,使用__all__能夠隱藏不想被import的默認值。 __all__變量是一個由string元素組成的list變量。 它定義了當咱們使用
3.from <module> import * 導入某個模塊的時候能導出的符號(這裏表明變量,函數,類等)。 from <module> import * 默認的行爲是從給定的命名空間導出全部的符號(固然下劃線開頭的變量,方法和類除外)。 須要注意的是 __all__ 隻影響到了 from <module> import * 這種導入方式, 對於 from <module> import <member> 導入方式並無影響,仍然能夠從外部導入。
建立__init__.py總結
包將有聯繫的模塊組織在一個,即放到同一個文件夾下,而且在這個文件夾建立一個名字爲__init__.py文件,那麼這個文件夾就稱之爲包
有效避免模塊名稱衝突問題,讓應用組織結構更加清晰
imp.reload()簡介
默認狀況下,模塊在第一次被導入以後,其餘的導入都再也不有效。若是此時在另外一個窗口中改變並保存了模塊的源代碼文件,也沒法更新該模塊。這樣設計緣由在於,導入是一個開銷很大的操做(導入必須找到文件,將其編譯成字節碼,而且運行代碼),以致於每一個文件、每一個程序運行不可以重複多於一次。
當一個模塊被導入到一個腳本,模塊頂層部分的代碼只會被執行一次。 所以,若是你想從新執行模塊裏頂層部分的代碼,能夠用reload()函數。該函數會從新導入以前導入過的模塊。
語法以下: reload(module_name)
''' dir函數 查看模塊信息 ''' # print(dir()) # print(dir(math)) ''' python中的包 目錄裏面必須含有 __init__.py ''' #經過import方法 逐個導入模塊 # import msg.send # msg.send.sendMsg() # import msg.recv # msg.recv.recvMsg() #經過from 一次性導入全部的模塊 #作一個包必定要建立一個__init__.py 裏面__all__指定容許被導入的包 # from msg import * # send.sendMsg() # recv.recvMsg() ''' 從新加載 ''' import test import imp imp.reload(test)
__init__.py文件
__all__ = ['send','recv']#容許被導入的模塊
recv.py
def recvMsg(): print('成功接收消息')
send.py
def sendMsg(): print('消息發送成功')
test.py
def test_add(x,y): return x + y print('哈哈你被我騙了')
test2.py
def test2_add(x,y): return x + y