自學Python6.2-類、模塊、包

自學Python之路-Python基礎+模塊+面向對象
自學Python之路-Python網絡編程
自學Python之路-Python併發編程+數據庫+前端
自學Python之路-django
html

自學Python6.2-類、模塊、包

1、類

類的概念在許多語言中出現,很容易理解。它將數據和操做進行封裝,以便未來的複用。前端

2、模塊module

一般模塊爲一個文件,直接使用import來導入就行了。能夠做爲module的文件類型有".py"、".pyo"、".pyc"、".pyd"、".so"、".dll"。python

在建立了一個腳本文件後,定義了某些函數和變量,可重複調用。程序員

任何的python程序均可以做爲模塊。數據庫

2.1 模塊導入django

每一個模塊都有本身的私有符號表,全部定義在模塊裏面的函數把它當作全局符號表使用。編程

模塊能夠導入其餘的模塊。一般將import語句放在模塊的開頭,被導入的模塊名字放在導入它的模塊的符號表中。網絡

from module import names  #能夠直接從模塊中導入名字到符號表,但模塊名字不會被導入。
from module import *      #能夠把模塊中的全部名字所有導入,除了那些如下劃線開頭的名字符號(不建議使用)。
系統在導入模塊時,要作如下三件事:
  • 爲源代碼文件中定義的對象建立一個名字空間,經過這個名字空間能夠訪問到模塊中定義的函數及變量
  • 在新建立的名字空間裏執行源代碼文件.
  • 建立一個名爲源代碼文件的對象,該對象引用模塊的名字空間,這樣就能夠經過這個對象訪問模塊中的函數及變量
import socket, os, regex   #用逗號分割模塊名稱就能夠同時導入多個模塊
import socket as net, thread as threads     #模塊導入時可使用 as 關鍵字來改變模塊的引用對象名字
from socket import gethostname #使用from語句能夠將模塊中的對象直接導入到當前的名字空間. from語句不建立一個到模塊名字空間的引用對象,而是把被導入模塊的一個或多個對象直接放入當前的名字空間
from socket import gethostname, socket from   #from支持逗號分割的對象
from socket import *    #載入全部對象到當前名字空間,只能導入__all__列表中存在的對象
from socket import gethostname as hostname   #as 和 from 聯合使用    只能用於一個模塊的最頂層

2.2 查看模塊  併發

內建函數dir()能夠查看模塊定義了什麼名字(包括變量名,模塊名,函數名等):dir(模塊名),沒有參數時返回全部當前定義的名字app

2.3 模塊搜索路徑

當導入一個模塊時,解釋器先在當前包中查找模塊,若找不到,而後在內置的built-in模塊中查找,找不到則按sys.path給定的路徑找對應的模塊文件(模塊名.py)
sys.path的初始值來自於如下地方:
  •  包含腳本當前的路徑,當前路徑
  •  PYTHONPATH
  •  默認安裝路徑 
添加路徑   append()或insert()增長新的目錄。
#module2.py
import sys
import os

print sys.path
workpath = os.path.dirname(os.path.abspath(sys.argv[0]))
sys.path.insert(0, os.path.join(workpath, 'modules'))
print sys.path

2.3 其餘的要點

模塊能像包含函數定義同樣,可包含一些可執行語句。這些可執行語句一般用來進行模塊的初始化工做。這些語句只在模塊第一次被導入時被執行。這很是重要,有些人覺得這些語句會屢次導入屢次執行,其實否則。

模塊在被導入執行時,python解釋器爲加快程序的啓動速度,會在與模塊文件同一目錄下生成.pyc文件。咱們知道python是解釋性的腳本語言,而.pyc是通過編譯後的字節碼,這一工做會自動完成,而無需程序員手動執行。

  • sys.modles記錄了全部被導入的模塊(一個模塊被導入以後不會再被導入)
  • sys.path 記錄了導入模塊的時候尋找的全部路徑

3、包package

3.1 一般包老是一個目錄,可使用import導入包,或者from + import來導入包中的部分模塊(把解決一類問題的模塊放在同一個文件夾裏,這個文件夾就是「包」)。

包目錄下爲首的一個文件即是 __init__.py , 而後是一些模塊文件和子目錄,假如子目錄中也有 __init__.py 那麼它就是這個包的子包了。(可是在python3裏面沒有__init__.py也不會出問題,可是在python2.7裏面就不能夠。)
 (__init__.py文件,主要是爲了不將文件夾名看成普通的字符串。__init__.py的內容能夠爲空,通常用來進行包的某些初始化工做或者設置__all__值,__all__是在from package-name import *這語句使用的,所有導出定義過的模塊。)

結構以下:

3.2 import語句語法:

遵循原則:凡是在導入時帶點的,點的左邊必須是一個包。

   from package import item  

   item能夠是package的子模塊或子包,或是其餘的定義在包中的名字(好比一個函數、類或變量)
   首先檢查item是否認義在包中,不過沒找到,就認爲item是一個模塊並嘗試加載它,失敗時會拋出一個ImportError異常。

   import item.subitem.subsubitem

    最後一個item以前的item必須是包,最後一個item能夠是一個模塊或包,但不能是類、函數和變量

   from pacakge import *

    若是包的__init__.py定義了一個名爲__all__的列表變量,它包含的模塊名字的列表將做爲被導入的模塊列表。  
    若是沒有定義__all__, 這條語句不會導入全部的package的子模塊,它只保證包package被導入,而後導入定義在包中的全部名字。

3.3 從包中導入單獨的模塊

    import PackageA.SubPackageA.ModuleA   使用時必須用全路徑名

    from PackageA.SubPackageA  import  ModuleA  能夠直接使用模塊名而不用加上包前綴 

    from PackageA.SubPackageA.ModuleA import functionA   直接導入模塊中的函數或變量 

import Graphics.Primitive.fill                 #導入模塊Graphics.Primitive.fill,只能以全名訪問模塊屬性,例如 Graphics.Primitive.fill.floodfill(img,x,y,color).  
from Graphics.Primitive import fill            # 導入模塊fill ,只能以 fill.屬性名這種方式訪問模塊屬性,例如 fill.floodfill(img,x,y,color).  
from Graphics.Primitive.fill import floodfill  #導入模塊fill ,並將函數floodfill放入當前名稱空間,直接訪問被導入的屬性,例如 floodfill(img,x,y,color).    
絕對路徑:
  • 無論在包內部仍是外部導入了就能用
  • 不能挪動,可是直觀
相對路徑
  • 能夠隨意移動包 只要能找到包的位置,就可使用包裏的模塊
  • 包裏的模塊若是想使用其它模塊的內容只能使用相對路徑,使用了相對路徑就不能在包內直接執行了

 

 

 

 

......

相關文章
相關標籤/搜索