python深入學習筆記2 上下文管理器

2021-08-14 12:29:57 字數 1444 閱讀 6317

上下文管理器(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...