Python 的標準安裝包括了一組模塊,稱之爲標準庫(standard library)。前幾篇blog中已經提到如何引用和使用第三方的模塊,此次主要說明自定義模塊在其它模塊的調用,以及包括這些模塊的工做方式。
在項目開發,程序員會考慮代碼的可擴展性和代碼的可重用性,使用模塊的好處,就是考慮使用了代碼的可重用性。
模塊
任何Python程序均可以做爲模塊導入,例如:
編寫一個hello.py文件,包名:com.easymorse
#!/usr/bin/python
#-*- coding: utf-8 -*-
#Filename: hello.py
print 'Hello Jordy!'
程序保存的位置比較重要,假如保存在/home/ubuntu/目錄中
編寫using_hello.py文件,引用hello模塊(這個文件與hello.py在同一個包目錄下):
#!/usr/bin/python
#-*- coding: utf-8 -*-
#Filename: us_hello.py
import hello
在引用hello模塊時,using_hello程序會在引用時,首先執行hello.py文件,並且在加載時只執行一次調用。若是在此導入該模塊就什麼也不會發生了。
import hello
在導入模塊時並非要在導入時執行某些操做,他們主要用於定義 類、函數、變量等。(這些東西只須要定義一次,導入模塊屢次和導入一次的效果是同樣的)
模塊中定義函數:
比方在hello.py模塊中定義一個函數
def sayhi():
print '執行sayhi方法'
在using_hello.py中導入hello模塊 import hello ,這時,print ‘Hello Jordy!’ 會被執行,訪問剛纔定義的sayhi()函數,能夠經過:
hello.sayhi()
咱們能夠經過一樣的方法來使用任何在模塊的全局做用域中定義的方法和變量。
模塊中添加測試代碼:
模塊是用來定義類、函數、變量的,但有些時候,在模塊中添加一些檢查模塊自己是否正常工做的測試代碼是頗有用的。例如:上述的hello模塊
#!/usr/bin/python
#-*- coding: utf-8 -*-
#Filename: hello.py
print 'Hello Jordy!'
def sayhi():
print '執行sayhi方法'
version = '0.1'
#測試調用
sayhi()
這樣在using_hello模塊導入hello模塊時,會自身調用sayhi()函數,來檢測這個函數的正確性。
但這同時會形成一個問題就是在導入hello模塊時,hello模塊自己會調用sayhi()函數,using_hello模塊中的
hello.sayhi()這句話又會執行sayhi()函數。爲了不這種狀況的發生,須要「告知」模塊自己是做爲程序運行仍是導入其餘程序,這時須要使用__name__變量:
![](http://static.javashuo.com/static/loading.gif)
經過上圖能夠看出,變量__name__的值是’__main__’,而在導入的模塊中,這個值就被設定爲模塊的名字,所以,爲了讓模塊的測試代碼更好的使用,能夠將其放置在if語句中,例如: #!/usr/bin/python #-*- coding: utf-8 -*- #Filename: hello.py print ‘Hello Jordy!’ def sayhi(): print ‘執行sayhi方法’ version = ’0.1′ #測試調用 def test(): sayhi() if __name__ == ‘__main__’: test() 這樣在hello.py在做爲程序執行時,sayhi()函數會被執行,而做爲模塊導入時,它的行爲就會像普通模塊同樣,只有在調用sayhi()函數時,纔會執行,而不是在模塊被導入時就會執行。 上述兩個文件都是在同一個包中列舉的例子,那麼當一個模塊在一個包(com.easymorse)中,另外一個模塊在另外一個包中(com.witmob),如何導入呢? 其實,咱們知道包就是模塊所在的目錄,爲了能讓Python將這個目錄做爲包對待,它必須包含一個命名爲__init__.py的文件(這個文件在咱們建立包時,eclipse會自動幫咱們建立這個命名的一個文件),若是將這個文件做爲一個模塊導入的話,文件的內容就是包的內容。 好比:在com.easymorse包中的__init__.py文件中有一個屬性: PI = 3.14 在com.witmob包中導入這個模塊: import com.easymorse print com.easymorse.PI 若是在com.witmob包中導入hello.py這個模塊,有兩種方式: import com.easymorse.hello from com.easymorse import hello 經過這兩種方式,均可以訪問hello模塊中的方法、屬性,它們區別在於: 第一種方式須要經過全名com.easymorse.hello.sayhi()來使用; 第二種方式能夠經過短名hello.sayhi()來使用;