上下文管理器(context manager)是python2.5開始支援的一種語法,用於規定某個物件的使用範圍。一旦進入或者離開該使用範圍,會有特殊操作被呼叫 (比如為物件分配或者釋放記憶體)。它的語法形式是with…as…
下面我們看一下兩段程式:
普通做法:
f=open("test.txt","a")
f.write("hello world!")
f.close()#只有你記得寫這句才會幫你關閉檔案
使用檔案管理器:
with open("test.txt.txt","a") as f:
print(f.closed)
f.write("dxt") #這裡!執行完這句後檔案關閉,但是f這個引用還是存在的!
print(f.closed)# <--所以
輸出:
false
true
with…as會幫你自動關閉檔案,而且**好像看起來更簡潔了^_^
上面的上下文管理器基於f物件的__exit__()特殊方法。當我們使用上下文管理器的語法時,我們實際上要求python在進入程式塊之前呼叫物件的__enter__()方法,在結束程式塊的時候呼叫__exit__()方法。對於檔案物件f來說,它定義了__enter__()和__exit__()方法(可以通過dir(f)看到)。在f的__exit__()方法中,有self.close()語句。所以在使用上下文管理器時,我們就不用明文關閉f檔案了。
下面,我們自定義用於上下文管理器的物件,就是下面的myvow:
class
vow(object):
def__init__
(self,text):
self.text=text
def__enter__
(self):
print("__enter__")
self.text="i say:"+self.text
return self
def__exit__
(self,type,value,traceback):
self.text=self.text+"!"
with vow("hollo") as myvow: #vow("hollo")返回物件self(此時self.text="i say:"+"hollo")給到 myvow
print(myvow.text)
#執行完這句後,自動呼叫__exit__()(此時self.text="i say hollo"+"!")
print(myvow.text)#所以再次print(myvow.text)時,myvow.text=i say hollo!"
輸出:
__enter__
i say:hollo
__exit__
i say:hollo!
Python深入學習筆記(二)
計數器counter counter類是自python2.7起增加的,屬於字典類的子類,是乙個容器物件,主要用來統計雜湊物件,支援集合操作 其中後兩項分別返回兩個counter物件各元素的最小值和最大值。from collections import counter c counter succes...
python深入學習筆記4 閉包
函式物件的作用域 函式物件的作用域與def所在層級相同。如 def line conf def line x return 2 x 1 print line 5 在作用域範圍內 line conf print line 5 超出作用域了閉包 函式是乙個物件,所以可以作為某一函式的返回結果。def l...
Django筆記 admin 深入學習
django 內建的管理後台,大部分時候可以通過對admin進行配置來提高開發效率。預設情況下顯示乙個models objects的列表,如果model定義了 str 方法,則顯示其返回的內容 乙個list或者tuple,需要展示在列表頁的字段 可以自定義 定義全域性操作按鈕 def comm ac...