Python標準庫---1六、內置類型:上下文管理器類型、其餘、特殊屬性

上一篇文章: Python標準庫---1五、內置類型:集合類型、映射類型
下一篇文章: Python標準庫---1七、內置異常

上下文管理器類型

Python 的 with 語句支持經過上下文管理器所定義的運行時上下文這一律念。 此對象的實現使用了一對專門方法,容許用戶自定義類來定義運行時上下文,在語句體被執行前進入該上下文,並在語句執行完畢時退出該上下文:python

contextmanager.__enter__()

進入運行時上下文並返回此對象或關聯到該運行時上下文的其餘對象。 此方法的返回值會綁定到使用此上下文管理器的 with 語句的 as 子句中的標識符。segmentfault

一個返回其自身的上下文管理器的例子是 file object。 文件對象會從 __enter__() 返回其自身,以容許 open() 被用做 with 語句中的上下文表達式。app

一個返回關聯對象的上下文管理器的例子是 decimal.localcontext() 所返回的對象。 此種管理器會將活動的 decimal 上下文設爲原始 decimal 上下文的一個副本並返回該副本。 這容許對 with 語句的語句體中的當前 decimal 上下文進行更改,而不會影響 with 語句之外的代碼。函數

contextmanager.__exit__(exc_type, exc_val, exc_tb)

退出運行時上下文並返回一個布爾值旗標來代表所發生的任何異常是否應當被屏蔽。 若是在執行 with 語句的語句體期間發生了異常,則參數會包含異常的類型、值以及回溯信息。 在其餘狀況下三個參數均爲 None。ui

自此方法返回一個真值將致使 with 語句屏蔽異常並繼續執行緊隨在 with 語句以後的語句。 不然異常將在此方法結束執行後繼續傳播。 在此方法執行期間發生的異常將會取代 with 語句的語句體中發生的任何異常。線程

傳入的異常絕對不該當被顯式地從新引起 —— 相反地,此方法應當返回一個假值以代表方法已成功完成而且不但願屏蔽被引起的異常。 這容許上下文管理代碼方便地檢測 __exit__() 方法是否確實已失敗。code

Python 定義了一些上下文管理器來支持簡易的線程同步、文件或其餘對象的快速關閉,以及更方便地操做活動的十進制算術上下文。 除了實現上下文管理協議之外,不一樣類型不會被特殊處理。 請參閱 contextlib 模塊查看相關的示例。對象

Python 的 generator 和 contextlib.contextmanager 裝飾器提供了實現這些協議的便捷方式。 若是使用 contextlib.contextmanager 裝飾器來裝飾一個生成器函數,它將返回一個實現了必要的 __enter__() and __exit__() 方法的上下文管理器,而再也不是由未經裝飾的生成器函數所產生的迭代器。ip

請注意,Python/C API 中 Python 對象的類型結構中並無針對這些方法的專門槽位。 想要定義這些方法的擴展類型必須將它們做爲普通的 Python 可訪問方法來提供。 與設置運行時上下文的開銷相比,單個類字典查找的開銷能夠忽略不計。ci

其餘內置類型

解釋器支持一些其餘種類的對象。 這些對象大都僅支持一兩種操做。

模塊

模塊惟一的特殊操做是屬性訪問: m.name,這裏 m 爲一個模塊而 name 訪問定義在 m 的符號表中的一個名稱。 模塊屬性能夠被賦值。 (請注意 import 語句嚴格來講也是對模塊對象的一種操做;import foo 不要求存在一個名爲 foo 的模塊對象,而是要求存在一個對於名爲 foo 的模塊的 (永久性) 定義。)

每一個模塊都有一個特殊屬性 dict__。 這是包含模塊的符號表的字典。 修改此字典將實際改變模塊的符號表,可是沒法直接對 dict 賦值 (你能夠寫 m.__dict__['a'] = 1,這會將 m.a 定義爲 1,可是你不能寫 m.__dict = {})。 不建議直接修改 __dict__。

內置於解釋器中的模塊會寫成這樣: <module 'sys' (built-in)>。 若是是從一個文件加載,則會寫成 <module 'os' from '/usr/local/lib/pythonX.Y/os.pyc'>。

類與類實例

關於這些類型請參閱 對象、值與類型 和 類定義。

函數

函數對象是經過函數定義建立的。 對函數對象的惟一操做是調用它: func(argument-list)。

實際上存在兩種不一樣的函數對象:內置函數和用戶自定義函數。 二者支持一樣的操做(調用函數),但實現方式不一樣,所以對象類型也不一樣。

更多信息請參閱 函數定義。

方法

方法是使用屬性表示法來調用的函數。 存在兩種形式:內置方法(例如列表的 append() 方法)和類實例方法。 內置方法由支持它們的類型來描述。

若是你經過一個實例來訪問方法(即定義在類命名空間內的函數),你會獲得一個特殊對象: 綁定方法 (或稱 實例方法) 對象。 當被調用時,它會將 self 參數添加到參數列表。 綁定方法具備兩個特殊的只讀屬性: m.__self__ 操做該方法的對象,而 m.__func__ 是實現該方法的函數。 調用 m(arg-1, arg-2, ..., arg-n) 徹底等價於調用 m.__func__(m.__self__, arg-1, arg-2, ..., arg-n)。

與函數對象相似,綁定方法對象也支持獲取任意屬性。 可是,因爲方法屬性實際上保存於下層的函數對象中 (meth.__func__),所以不容許設置綁定方法的方法屬性。 嘗試設置方法的屬性將會致使引起 AttributeError。 想要設置方法屬性,你必須在下層的函數對象中顯式地對其進行設置:

>>> class C:
...     def method(self):
...         pass
...
>>> c = C()
>>> c.method.whoami = 'my name is method'  # can't set on the method
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'method' object has no attribute 'whoami'
>>> c.method.__func__.whoami = 'my name is method'
>>> c.method.whoami
'my name is method'

更多信息請參閱 標準類型層級結構。

代碼對象

代碼對象被具體實現用來表示「僞編譯」的可執行 Python 代碼,例如一個函數體。 它們不一樣於函數對象,由於它們不包含對其全局執行環境的引用。 代碼對象由內置的 compile() 函數返回,並可經過從函數對象的 code 屬性從中提取。 另請參閱 code 模塊。

能夠經過將代碼對象(而非源碼字符串)傳給 exec() 或 eval() 內置函數來執行或求值。

更多信息請參閱 標準類型層級結構。

類型對象

類型對象表示各類對象類型。 對象的類型可經過內置函數 type() 來獲取。 類型沒有特殊的操做。 標準庫模塊 types 定義了全部標準內置類型的名稱。

類型以這樣的寫法來表示: <class 'int'>。

空對象

此對象會由不顯式地返回值的函數所返回。 它不支持任何特殊的操做。 空對象只有一種值 None (這是個內置名稱)。 type(None)() 會生成同一個單例。

該對象的寫法爲 None。

省略符對象

此對象常被用於切片 (參見 切片)。 它不支持任何特殊的操做。 省略符對象只有一種值 Ellipsis (這是個內置名稱)。 type(Ellipsis)() 會生成 Ellipsis 單例。

該對象的寫法爲 Ellipsis 或 ...。

未實現對象

此對象會被做爲比較和二元運算被應用於它們所不支持的類型時的返回值。 請參閱 比較運算 瞭解更多信息。 未實現對象只有一種值 NotImplemented。 type(NotImplemented)() 會生成這個單例。

該對象的寫法爲 NotImplemented。

布爾值

布爾值是兩個常量對象 False 和 True。 它們被用來表示邏輯上的真假(不過其餘值也可被看成真值或假值)。 在數字類的上下文中(例如被用做算術運算符的參數時),它們的行爲分別相似於整數 0 和 1。 內置函數 bool() 可被用來將任意值轉換爲布爾值,只要該值可被解析爲一個邏輯值(參見以前的 邏輯值檢測 部分)。

該對象的寫法分別爲 False 和 True。

內部對象

有關此對象的信息請參閱 標準類型層級結構。 其中描述了棧幀對象、回溯對象以及切片對象等等。

特殊屬性

語言實現爲部分對象類型添加了一些特殊的只讀屬性,它們具備各自的做用。 其中一些並不會被 dir() 內置函數所列出。

object.__dict__

一個字典或其餘類型的映射對象,用於存儲對象的(可寫)屬性。

instance.__class__

類實例所屬的類。

class.__bases__

由類對象的基類所組成的元組。

definition.__name__

類、函數、方法、描述器或生成器實例的名稱。

definition.__qualname__

類、函數、方法、描述器或生成器實例的 qualified name。

3.3 新版功能.

class.__mro__

此屬性是由類組成的元組,在方法解析期間會基於它來查找基類。

class.mro()

此方法可被一個元類來重載,覺得其實例定製方法解析順序。 它會在類實例化時被調用,其結果存儲於 __mro__ 之中。

class.__subclasses__()

每一個類會保存由對其直接子類的弱引用組成的列表。 此方法將返回一個由仍然存在的全部此類引用組成的列表。 例如:
>>> int.__subclasses__()
    [<class 'bool'>]
上一篇文章: Python標準庫---1五、內置類型:集合類型、映射類型
下一篇文章: Python標準庫---1七、內置異常
相關文章
相關標籤/搜索