對象,是 Python 對數據的抽象概念。Python 中的全部數據都是以對象或對象間的關係來實現的。(某種意義上,代碼也是由對象來實現的,這與馮·諾依曼的「stored program computer」模型相一致)。每一個對象都有 id、type、和 value。對象的 id 從建立之時起就再也不改變,你能夠把它想象成對象在內存中的地址。is 運算符就是比較的兩個對象的 id,或者你也能夠經過內建的 id() 函數來直接查看。python
with 語句是被設計用來簡化「try / finally」語句的。一般的用處在於共享資源的獲取和釋放,好比文件、數據庫和線程資源。它的用法以下:shell
with context_exp [as var]:數據庫
with_suit函數
with 語句也是複合語句的一種,就像 if、try 同樣,它的後面也有個「:」,而且緊跟一個縮進的代碼塊 with_suit。context_exp 表達式的做用是提供一個上下文管理器(Context Manager),整個 with_suit 代碼塊都是在這個上下文管理器的運行環境下執行的。context_exp 能夠直接是一個上下文管理器的引用,也能夠是一句可執行的表達式,with 語句會自動執行這個表達式以得到上下文管理對象。with 語句的實際執行流程是這樣的:ui
即,能夠把 __exit__() 方法當作是「try / finally」的 finally,它老是會被自動調用。Python 裏已經有了一些支持上下文管理協議的對象,好比文件對象,在使用 with 語句處理文件對象時,能夠再也不關心「打開的文件必須記得要關閉」這個問題了:線程
>>> with open('test.py') as f: print(f.readline()) #!/usr/bin/env python >>> f.readline() Traceback (most recent call last): File "<pyshell#3>", line 1, in <module> f.readline() ValueError: I/O operation on closed file.
能夠看到在 with 語句完成後,f 已經自動關閉了,這個過程就是在 f 的__exit__() 方法裏完成的。而後下面再來詳細介紹一下上下文管理器:設計
Python 使用上下文管理協議定義了一種運行時上下文環境(runtime context)。上下文管理協議由包含了一對方法的上下文管理對象實現:它會在子代碼塊運行前進入一個運行時上下文,並在代碼塊結束後退出該上下文。咱們通常使用 with 語句來調用上下文管理對象,這樣代碼清晰度較好。code
>>> with open('test.py') as f: '__enter__' in dir(f) '__exit__' in dir(f) True True
>>> import decimal >>> with decimal.localcontext() as ctx: ctx.prec = 22 print(decimal.getcontext().prec) 22 >>> print(decimal.getcontext().prec) 28
>>> class Ctx(object): def __init__(self,ign=None): self.ign = ign def __enter__(self): pass def __exit__(self,exc_type,exc_val,exc_tb): return self.ign >>> with Ctx(True): raise TypeError('Ignored?') >>> with Ctx(False): raise TypeError('Ignored?') Traceback (most recent call last): File "<pyshell#28>", line 2, in <module> raise TypeError('Ignored?') TypeError: Ignored?