Python的學習之旅———模塊與包的使用 常用模塊


一:import

導入模塊,只會在第一次導入時執行源文件的代碼
如果模塊已經加載到內存了,下一次導入直接引用內存中導入的結果

eval:提取字符串內的表達式執行,然后返回執行結果

import 導入文件都做了哪些事?

1 以源文件為准產生一個名稱空間
2 以剛剛產生的名稱空間為准,執行源文件的代碼
3 會在當前文件中定義一個名字,這個名字就是模塊名,用來引用模塊中的名字

為模塊起別名

import spam as sm

1 engine_type='mysql'
2 if engine_type == 'mysql':
3      import mysql as engine
4 elif engine_type == 'oracle':
5      import oracle as engine
6 engine.parse()

可以把兩個不同的模塊引入時候起相同的別名 ,做到調用的時候統一化。小技巧

在一行導入多個模塊

1 import sys,os,re

二 使用模塊之from ... import...

from spam import read1,read2,moeny

直接導入了spam中的 函數 read1 和read2 的名字 也可以導入變量名字 money

這樣使用的時候就不用以spam.read1()的方式調用函數了.

from spam import *

一下把spam.py中的所有名字都引入了

如果引入的模塊中有__all__=['字符串函數名','字符串變量名']那么

from spam import * 中* 對應模塊spam內的__all__列表內的名字。

三模塊的重載 

考慮到性能的原因,每個模塊只被導入一次,放入字典sys.module中,如果你改變了模塊的內容,你必須重啟程序,python不支持重新加載或卸載之前導入的模塊,

有的同學可能會想到直接從sys.module中刪除一個模塊不就可以卸載了嗎,注意了,你刪了sys.module中的模塊對象仍然可能被其他程序的組件所引用,因而不會被清楚。

特別的對於我們引用了這個模塊中的一個類,用這個類產生了很多對象,因而這些對象都有關於這個模塊的引用。

如果只是你想交互測試的一個模塊,使用 importlib.reload(), e.g. import importlib; importlib.reload(modulename),這只能用於測試環境。

四py文件模塊與腳本的區別

 1 編寫好的一個python文件可以有兩種用途:
 2     一:腳本,一個文件就是整個程序,用來被執行
 3     二:模塊,文件中存放着一堆功能,用來被導入使用
 4 
 5 
 6 python為我們內置了全局變量__name__,
 7     當文件被當做腳本執行時:__name__ 等於'__main__'
 8     當文件被當做模塊導入時:__name__等於模塊名
 9 
10 作用:用來控制.py文件在不同的應用場景下執行不同的邏輯
11     if __name__ == '__main__':

__name__的判斷要在寫在模塊(腳本程序中)

文件spam.py當做腳本執行,該值等於__main__,文件spam.py當做模塊被導入時,該值等於腳本名(spam)

五 模塊的搜索路徑

模塊的查找順序是:內存中已經加載的模塊->內置模塊(系統內置那些)->sys.path路徑中包含的模塊

1 import sys
2 sys.path.append(r'文件路徑\a')   a是文件夾
3 import m
4 也可以先去找到a 然后順着a找到m(a和執行文件是在同一個目錄下)
5 from a import m

把文件的路徑加入系統環境變量中,這是加入一次,而不是永久寫入。

六 包介紹

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

具體的:包就是一個包含有__init__.py文件的文件夾,所以其實我們創建包的目的就是為了用文件夾將文件/模塊組織起來

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

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

2需要注意的是

#1.關於包相關的導入語句也分為import和from ... import ...兩種,
但是無論哪種,無論在什么位置,在導入時都必須遵循一個原則:
凡是在導入時帶點的,點的左邊都必須是一個包(也就是說文件夾下必須有__init__.py這個文件),否則非法。
可以帶有一連串的點,如item.subitem.subsubitem,
但都必須遵循這個原則。但對於導入后,在使用時就沒有這種限制了,
點的左邊可以是包,模塊,函數,類(它們都可以用點的方式調用自己的屬性)。

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

#3、包A和包B下有同名模塊也不會沖突,如A.a與B.a來自倆個命名空間

包的標志就是包含__init__.py這個文件。

圖列:

 模塊導入的時候都會做三件事 

1 以源文件為准產生一個名稱空間
2 以剛剛產生的名稱空間為准,執行源文件的代碼
3 會在當前文件中定義一個名字,這個名字就是模塊名,用來引用模塊中的名字

總結

1 import包的時候 建議使用 from ...import的形式。這樣就不用sys.path.append(r'包的路徑')
2 
3 from可以用來指定路徑  import決定需要獲取的名稱空間
4 
5 運行文件和包在同一文件夾下的時候 可以直接import
6 
7 運行文件和包不在同一文件夾下的時候c:\a\b\c\d\ 運行文件在a下  包在d下 那么就需要在運行文件中首先導入sys.path.append(r'c:\a\b\c\d')
包以及包所包含的模塊都是用來被導入的,而不是被直接執行的。而環境變量都是以執行文件為准的

 執行文件調用包內名稱的方式決定了from 路徑結構

第一種

1 執行文件中
2 import a
3 a.f1()
4 a.f2()
5 a.f3()
6 a包 __init__中的代碼 7 from .am1 import f1 #等同於絕對路徑from a.am1 import f1
8 from .am2 import f2 9 from .b.bm1 import f3

第二種

執行文件中
import a.b.bm1
a.b.bm1.f3()
a包
__init__中沒有代碼

第三種

1 執行文件中
2 from a.b.bm1 import f3
3 f3()
4 a包 __init__中沒有代碼

 第一種依賴包中__init__ ,第二種是不依賴__init__.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM