python 模組和包

來源:互聯網
上載者:User

標籤:XmlReader   如何使用   針對   結構   指令碼   module   dll   bsp   檔案的   

一,模組1,什麼是模組?

常見的情境: 一個模組就是一個包含了python定義和聲明的檔案,檔案名稱就是模組名字加上.py 的尾碼.

但其實 import 載入的模組分為四個通用類別:

  1,使用python編寫的代碼 (.py檔案)

  2,已被編譯為共用庫或DLL的C或C++擴充

  3,包好一組模組的包

  4,使用C編寫並連結到python解譯器的內建模組

2,為何要使用模組

  如果你退出python解譯器,然後重新進入,那麼你之前定義的函數或者變數都將丟失,因此我們通常將程式寫到檔案中,以便永久儲存下來,需要時就通過python test.py方式去執行,此時test.py被稱為指令碼script.

    隨著程式的發展,功能越來越多,為了方便管理,我們通常將程式分成一個個的檔案,這樣做程式的結構更清晰,方便管理。這時我們不僅僅可以把這些檔案當做指令碼去執行,還可以把他們當做模組來匯入到其他的模組中,實現了功能的重複利用

3,如何使用模組?3.1 import

樣本檔案: 自訂模組my_module.py, 檔案名稱my_module.py, 模組名my_module

#my_module.pyprint(‘from the my_module.py‘)money=1000def read1():    print(‘my_module->read1->money‘,money)def read2():    print(‘my_module->read2 calling read1‘)    read1()def change():    global money    money=0
my_module模組3.1.1

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

#demo.pyimport my_module #只在第一次匯入時才執行my_module.py內代碼,此處的顯式效果是只列印一次‘from the my_module.py‘,當然其他的頂級代碼也都被執行了,只不過沒有顯示效果.import my_moduleimport my_moduleimport my_module‘‘‘執行結果:from the my_module.py‘‘‘
demo.py


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

3.1.2

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

#測試一:money與my_module.money不衝突#demo.pyimport my_modulemoney=10print(my_module.money)‘‘‘執行結果:from the my_module.py1000‘‘‘
測試一:money與my_module.money不衝突
#測試二:read1與my_module.read1不衝突#demo.pyimport my_moduledef read1():    print(‘========‘)my_module.read1()‘‘‘執行結果:from the my_module.pymy_module->read1->money 1000‘‘‘
測試二:read1與my_module.read1不衝突
#測試三:執行my_module.change()操作的全域變數money仍然是my_module中的#demo.pyimport my_modulemoney=1my_module.change()print(money)‘‘‘執行結果:from the my_module.py1‘‘‘
測試三:執行my_module.change()操作的全域變數money仍然是my_module中的3.1.3

總結:首次匯入模組my_module時會做三件事:

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

2.在新建立的命名空間中執行模組中包含的代碼,見初始匯入import my_module

提示:匯入模組時到底執行了什嗎?  In fact function definitions are also ‘statements’ that are ‘executed’; the execution of a module-level function definition enters the function name in the module’s global symbol table.事實上函數定義也是“被執行”的語句,模組層級別函數定義的執行將函數名放入模組全域名稱空間表,用globals()可以查看

3.建立名字my_module來引用該命名空間

這個名字和變數名沒什麼區別,都是‘第一類的’,且使用my_module.名字的方式可以訪問my_module.py檔案中定義的名字,my_module.名字與test.py中的名字來自兩個完全不同的地方。
3.1.4

為模組起別名,相當於m1 = 1 ; m2 = m1

1 import my_module as sm2 print(sm.money)

 

示範用法一:

有兩中sql模組mysql和oracle,根據使用者的輸入,選擇不同的sql功能

#mysql.pydef sqlparse():    print(‘from mysql sqlparse‘)#oracle.pydef sqlparse():    print(‘from oracle sqlparse‘)#test.pydb_type=input(‘>>: ‘)if db_type == ‘mysql‘:    import mysql as dbelif db_type == ‘oracle‘:    import oracle as dbdb.sqlparse() 複製代碼
樣本用法1

 

示範用法二:

為已經匯入的模組起別名的方式對編寫可擴充的代碼很有用,假設有兩個模組xmlreader.py 和 csvreader.py,它們都定義了函數 read_data (filename):用來從檔案中讀取一些資料,但採用不同的輸入格式.可以編寫代碼來選擇性地選擇讀模數塊,例如:

if file_format == ‘xml‘:     import xmlreader as readerelif file_format == ‘csv‘:     import csvreader as readerdata=reader.read_date(filename)
樣本用法23.1.5

在一行帶入多個模組

import sys,os,re # 不建議使用,不符合PEP 8

 

3.2 from ... import...3.2.1

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

而from語句當中的import, 也會建立新的名稱空間,但是將my_module中地名字直接匯入到當前地名稱空間中,在當前名稱名稱空間中,直接只用名字就可以了.

from my_module import read1,read2

這樣在當前位置直接使用read1和read2就好了,執行時,仍然以my_module.py檔案全域名稱空間

#測試一:匯入的函數read1,執行時仍然回到my_module.py中尋找全域變數money#demo.pyfrom my_module import read1money=1000read1()‘‘‘執行結果:from the my_module.pyspam->read1->money 1000‘‘‘#測試二:匯入的函數read2,執行時需要調用read1(),仍然回到my_module.py中找read1()#demo.pyfrom my_module import read2def read1():    print(‘==========‘)read2()‘‘‘執行結果:from the my_module.pymy_module->read2 calling read1my_module->read1->money 1000‘‘‘
View Code


如果當前有重名read1或者read2,那麼會有覆蓋效果。

#測試三:匯入的函數read1,被當前位置定義的read1覆蓋掉了#demo.pyfrom my_module import read1def read1():    print(‘==========‘)read1()‘‘‘執行結果:from the my_module.py==========‘‘‘
View Code

需要特彆強調的一點是:python中的變數賦值不是一種儲存操作,而只是一種綁定關係,如下:

from my_module import money,read1money=100 #將當前位置的名字money綁定到了100print(money) #列印當前的名字read1() #讀取my_module.py中的名字money,仍然為1000‘‘‘from the my_module.py100my_module->read1->money 1000‘‘‘
View Code3.2.2

也支援as

from my_module import read1 as read
3.2.3

也支援匯入多行

1 from my_module import (read1, read2, money)
3.2.4

from my_module import * 把my_module中所有的不是以底線(_)開頭的名字都匯入到當前位置,大部分情況下我們的python程式不應該使用這種匯入方式,因為*你不知道你匯入什麼名字,很有可能會覆蓋掉你之前已經定義的名字。而且可讀性極其的差,在互動式環境中匯入時沒有問題。

from my_module import * #將模組my_module中所有的名字都匯入到當前名稱空間print(money)print(read1)print(read2)print(change)‘‘‘執行結果:from the my_module.py1000<function read1 at 0x1012e8158><function read2 at 0x1012e81e0><function change at 0x1012e8268>‘‘‘
View Code

在my_module.py中新增一行

__all__=[‘money‘,‘read1‘] #這樣在另外一個檔案中用from my_module import *就這能匯入列表中規定的兩個名字


*如果my_module.py中的名字前加_,即_money,則from my_module import *,則_money不能被匯入

3.2.5 模組地迴圈應用問題

思考:假如有兩個模組a,b。我可不可以在a模組中import b ,再在b模組中import a?

3.2.6 模組地載入與修改

考慮到效能的原因,每個模組只被匯入一次,放入字典sys.modules中,如果你改變了模組的內容,你必須重啟程式,python不支援重新載入或卸載之前置入的模組,

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

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

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

def func1():    print(‘func1‘)
aa.py
import time,importlibimport aa time.sleep(20)# importlib.reload(aa)aa.func1()
測試代碼

在20秒的等待時間裡,修改aa.py中func1的內容,等待test.py的結果。

開啟importlib注釋,重新測試

 

未完成????

 

python 模組和包

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.