模塊python
一般模塊爲一個文件,直接使用import來導入就行了。能夠做爲module的文件類型有".py"、".pyo"、".pyc"、".pyd"、".so"、".dll"。socket
包ide
一般包老是一個目錄,可使用import導入包,或者from + import來導入包中的部分模塊。包目錄下爲首的一個文件即是 __init__.py。而後是一些模塊文件和子目錄,假如子目錄中也有 __init__.py 那麼它就是這個包的子包了。函數
一模塊
你可使用import語句將一個源代碼文件做爲模塊導入.例如:spa
# file : spam.py
a = 37 # 一個變量
def foo: # 一個函數
print "I'm foo"
class bar: # 一個類
def grok(self):
print "I'm bar.grok"
b = bar() # 建立一個實例命令行
使用import spam 語句就能夠將這個文件做爲模塊導入。系統在導入模塊時,要作如下三件事:
1.爲源代碼文件中定義的對象建立一個名字空間,經過這個名字空間能夠訪問到模塊中定義的函數及變量。對象
2.在新建立的名字空間裏執行源代碼文件.作用域
3.建立一個名爲源代碼文件的對象,該對象引用模塊的名字空間,這樣就能夠經過這個對象訪問模塊中的函數及變量,如: 字符串
import spam # 導入並運行模塊 spam
print spam.a # 訪問模塊 spam 的屬性
spam.foo()
c = spam.bar()
...get
用逗號分割模塊名稱就能夠同時導入多個模塊:
import socket, os, regex模塊導入時可使用 as 關鍵字來改變模塊的引用對象名字:
import os as system
import socket as net, thread as threads
system.chdir("..")
net.gethostname()
使用from語句能夠將模塊中的對象直接導入到當前的名字空間. from語句不建立一個到模塊名字空間的引用對象,而是把被導入模塊的一個或多個對象直接放入當前的名字空間:
from socket import gethostname
# 將gethostname放如當前名字空間
print gethostname() # 直接調用
socket.gethostname() # 引起異常NameError: socket
from語句支持逗號分割的對象,也可使用星號(*)表明模塊中除下劃線開頭的全部對象:
from socket import gethostname, socket
from socket import * # 載入全部對象到當前名字空間
不過,若是一個模塊若是定義有列表__all__,則from module import * 語句只能導入__all__列表中存在的對象。
# module: foo.py
__all__ = [ 'bar', 'spam' ] # 定義使用 `*` 能夠導入的對象
另外, as 也能夠和 from 聯合使用:
from socket import gethostname as hostname
h = hostname()
import 語句能夠在程序的任何位置使用,你能夠在程序中屢次導入同一個模塊,但模塊中的代碼*僅僅*在該模塊被首次導入時執行。後面的import語句只是簡單的建立一個到模塊名字空間的引用而已。sys.modules字典中保存着全部被導入模塊的模塊名到模塊對象的映射。這個字典用來決定是否須要使用import語句來導入一個模塊的最新拷貝.
from module import * 語句只能用於一個模塊的最頂層.*特別注意*:因爲存在做用域衝突,不容許在函數中使用from 語句。
每一個模塊都擁有 __name__ 屬性,它是一個內容爲模塊名字的字符串。最頂層的模塊名稱是 __main__ .命令行或是交互模式下程序都運行在__main__ 模塊內部. 利用__name__屬性,咱們可讓同一個程序在不一樣的場合(單獨執行或被導入)具備不一樣的行爲,象下面這樣作:
# 檢查是單獨執行仍是被導入
if __name__ == '__main__':
# Yes
statements # 執行python腳本時,會調用這部分代碼
else:
# No (可能被做爲模塊導入)
statements # 被導入時,會自動調用這部分代碼