1. 程式人生 > >Python的with內部原理解析

Python的with內部原理解析

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的操作,挺方便的。