Python的with內部原理解析
阿新 • • 發佈:2018-12-28
Python與java相比有一個比較好用的關鍵字,with
with的比較常見的操作用於對檔案的操作
with open('test.txt') as f:
print f.read()
短短的幾行程式碼既能夠實現對檔案的讀取,但是我們怎樣建立一個自己的額class並支援with關鍵字呢? Python對with的處理還很聰明。基本思想是with所求值的物件必須有一個__enter__()方法,一個__exit__()方法。 緊跟with後面的語句被求值後,返回物件的__enter__()方法被呼叫,這個方法的返回值將被賦值給as後面的變數。當with後面的程式碼塊全部被執行完之後,將呼叫前面返回物件的__exit__()方法。 舉例說明
# coding=utf-8
class WithDemo(object):
def __init__(self, name):
self.name = name
def __enter__(self):
print 'enter:' + self.name
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print 'in:' + self.name
print "type:", exc_type
print "value:", exc_val
print "trace:", exc_tb
def do_something(self):
bar = 1 / 0
return bar + 10
with WithDemo('changshuhang') as w:
# print w
# w.do_something()
print w
需要注意的地方__enter__返回一個物件然後賦值給w,在__exit__進行一些clear的操作,挺方便的。