1.with語句時用於對try except finally 的優化,讓**更加美觀,
例如常用的開發檔案的操作,用try except finally 實現:
f=open('file_name','r')開啟檔案的時候,為了能正常釋放檔案的控制代碼,都要加個try,然後再finally裡把f close掉,但是這樣的**不美觀,finally就像個尾巴,一直託在後面,尤其是當try裡面的語句時幾十行try:
r=f.read()
except:
pass
finally:
f.close()
用with的實現:
with open('file_name','r') as f:這條語句就好簡潔很多,當with裡面的語句產生異常的話,也會正常關閉檔案r=f.read()
2.除了開啟檔案,with語句還可以用於哪些地方呢?
with只適用於上下文管理器的呼叫,除了檔案外,with還支援 threading、decimal等模組,當然我們也可以自己定義可以給with呼叫的上下文管理器
2.1使用類定義上下文管理器
class a():使用類定義上下文管理器需要在類上定義__enter__和__exit__方法,執行with a() as a: 語句時會先執行__enter__方法,這個方法的返回值會賦值給後面的a變數,當with裡面的語句產生異常或正常執行完時,都好呼叫類中的__exit__方法。def __enter__(self):
self.a=1
return self
def f(self):
print 'f'
def __exit__(self,a,b,c):
print 'exit'
def func():
return a()
with a() as a:
1/0a.f()
print a.a
2.2使用生成器定義上下文管理器
from contextlib import contextmanager2.3 自定義支援 closing 的物件@contextmanager
def demo():
print '這裡的**相當於__enter__裡面的**'
yield 'i ma value'
print '這裡的**相當於__exit__裡面的**'
with demo() as value:
print value
class closing(object):def __init__(self, thing):
self.thing = thing
def __enter__(self):
return self.thing
def __exit__(self, *exc_info):
self.thing.close()
class a():
def __init__(self):
self.thing=open('file_name','w')
def f(self):
print '執行函式'
def close(self):
self.thing.close()
with closing(a()) as a:
a.f()
python with關鍵字做了些啥?
python 上下文管理協議 我們時常會使用如下的 with open 1.txt as f print f.readlines 我們被告知這樣可以 安全 的開啟乙個檔案。因為當 執行超出 with 的作用域時檔案會自動關閉。那這是怎麼做到的呢。這就涉及到python上下文管理協議。乙個物件的實現使...
python with關鍵字 I O好伴侶
學習python的朋友都知道檔案讀寫的基本操作,通常我們讀寫文字的姿勢是這個樣子的 f open file name f.close 每次定義乙個檔案讀寫物件,在操作完成後,我們都需要進行關閉操作,如果你一不小心忘記了,恭喜你中獎了?你的程式很可能發生記憶體洩露,然後記憶體溢位,然後就掛了。這樣的事...
學習this關鍵字
在學習msdn的過程中加入一點自己的理解 先學習類例項使用this 以下是 this 的常用用途 printing method public void printemployee nalias name alias passing the object to the calctax method ...