1. 程式人生 > >5-4模塊和包

5-4模塊和包

自己 包含 否則 init form font tro 多個 即使

1,模塊

模塊的本質就是py文件,一個模塊就是一個包含了python定義和聲明的文件,文件名就是模塊名字加上.py的後綴。

2,import語句

引入的模塊必須滿足兩個條件
1.模塊名必須滿足變量名的規範
2.被導入的模塊所在的位置必須在sys.path所在的搜索路徑中

模塊可以包含可執行的語句和函數的定義,這些語句的目的是初始化模塊,它們只在模塊名第一次遇到導入import語句時才執行(import語句是可以在程序中的任意位置使用的,且針對同一個模塊很import多次,為了防止你重復導入,python的優化手段是:第一次導入後就將模塊名加載到內存了,後續的import語句僅是對已經加載大內存中的模塊對象增加了一次引用,不會重新執行模塊內的語句。

我們可以從sys.modules中找到當前已經加載的模塊,sys.modules是一個字典,內部包含模塊名與模塊對象的映射,該字典決定了導入模塊時是否需要重新導入。

每個模塊都是一個獨立的名稱空間,定義在這個模塊中的函數,把這個模塊的名稱空間當做全局名稱空間,這樣我們在編寫自己的模塊時,就不用擔心我們定義在自己模塊中全局變量會在被導入時,與使用者的全局變量沖突。

  首次導入模塊my_module時會做三件事:

  1.為源文件(my_module模塊)創建新的名稱空間,在my_module中定義的函數和方法若是使用到了global時訪問的就是這個名稱空間。

  2.在新創建的命名空間中執行模塊中包含的代碼,見初始導入import my_module。

  3.創建名字(模塊)來引用該命名空間。

3,as關鍵字為模塊名起別名

  1 import my_module as sm
  2 print(sm.money)

示範用法一:

有兩中sql模塊mysql和oracle,根據用戶的輸入,選擇不同的sql功能。

#mysql.py
def sqlparse():
    print(from mysql sqlparse)
#oracle.py
def sqlparse():
    print(from oracle sqlparse)

#test.py
db_type=input(>>: )
if db_type == 
mysql: import mysql as db elif db_type == oracle: import oracle as db db.sqlparse()

示範用法二:

為已經導入的模塊起別名的方式對編寫可擴展的代碼很有用,假設有兩個模塊xmlreader.py和csvreader.py,它們都定義了函數read_data(filename):用來從文件中讀取一些數據,但采用不同的輸入格式。可以編寫代碼來選擇性地挑選讀取模塊。

if file_format == xml:
     import xmlreader as reader
elif file_format == csv:
     import csvreader as reader
data=reader.read_date(filename)

還可以在一行導入多個模塊: import sys,os,re

4, from ... import...

導入的名字直接屬於全局,但是指向模塊的名字所在的內存空間。

對比import my_module,會將源文件的名稱空間‘my_module‘帶到當前名稱空間中,使用時必須是my_module.名字的方式

而from 語句相當於import,也會創建新的名稱空間,但是將my_module中的名字直接導入到當前的名稱空間中,在當前名稱空間中,直接使用名字就可以了。

所以總結模塊的查找順序是:內存中已經加載的模塊->內置模塊->sys.path路徑中包含的模塊。

4.1把模塊當腳本使用:

我們可以通過模塊的全局變量__name__來查看模塊名:
當做腳本運行:
__name__ 等於‘__main__‘

當做模塊導入:
__name__= 模塊名

作用:用來控制.py文件在不同的應用場景下執行不同的邏輯
if __name__ == ‘__main__‘:

5,包

包是一種通過使用‘.模塊名’來組織python模塊名稱空間的方式。

1. 無論是import形式還是from...import形式,凡是在導入語句中(而不是在使用時)遇到帶點的,都要第一時間提高警覺:這是關於包才有的導入語法

2. 包是目錄級的(文件夾級),文件夾是用來組成py文件(包的本質就是一個包含__init__.py文件的目錄)

3. import導入文件時,產生名稱空間中的名字來源於文件,import 包,產生的名稱空間的名字同樣來源於文件,即包下的__init__.py,導入包本質就是在導入該文件

強調:

  1. 在python3中,即使包下沒有__init__.py文件,import 包仍然不會報錯,而在python2中,包下一定要有該文件,否則import 包報錯

  2. 創建包的目的不是為了運行,而是被導入使用,記住,包只是模塊的一種形式而已,包即模塊

註意事項:


1.關於包相關的導入語句也分為import和from ... import ...兩種,但是無論哪種,無論在什麽位置,在導入時都必須遵循一個原則:凡是在導入時帶點的,點的左邊都必須是一個包,否則非法。可以帶有一連串的點,如item.subitem.subsubitem,但都必須遵循這個原則。

2.對於導入後,在使用時就沒有這種限制了,點的左邊可以是包,模塊,函數,類(它們都可以用點的方式調用自己的屬性)。

3.對比import item 和from item import name的應用場景:
如果我們想直接使用name那必須使用後者。

5-4模塊和包