摘要:退出運行時上下文并返回一個布爾值旗標來表明所發生的任何異常是否應當被屏蔽。除了實現上下文管理協議以外,不同類型不會被特殊處理。其中一些并不會被內置函數所列出。
上一篇文章:Python標準庫---15、內置類型:集合類型、映射類型上下文管理器類型
下一篇文章:Python標準庫---17、內置異常
Python 的 with 語句支持通過上下文管理器所定義的運行時上下文這一概念。 此對象的實現使用了一對專門方法,允許用戶自定義類來定義運行時上下文,在語句體被執行前進入該上下文,并在語句執行完畢時退出該上下文:
contextmanager.__enter__()進入運行時上下文并返回此對象或關聯到該運行時上下文的其他對象。 此方法的返回值會綁定到使用此上下文管理器的 with 語句的 as 子句中的標識符。
一個返回其自身的上下文管理器的例子是 file object。 文件對象會從 __enter__() 返回其自身,以允許 open() 被用作 with 語句中的上下文表達式。
一個返回關聯對象的上下文管理器的例子是 decimal.localcontext() 所返回的對象。 此種管理器會將活動的 decimal 上下文設為原始 decimal 上下文的一個副本并返回該副本。 這允許對 with 語句的語句體中的當前 decimal 上下文進行更改,而不會影響 with 語句以外的代碼。
contextmanager.__exit__(exc_type, exc_val, exc_tb)退出運行時上下文并返回一個布爾值旗標來表明所發生的任何異常是否應當被屏蔽。 如果在執行 with 語句的語句體期間發生了異常,則參數會包含異常的類型、值以及回溯信息。 在其他情況下三個參數均為 None。
自此方法返回一個真值將導致 with 語句屏蔽異常并繼續執行緊隨在 with 語句之后的語句。 否則異常將在此方法結束執行后繼續傳播。 在此方法執行期間發生的異常將會取代 with 語句的語句體中發生的任何異常。
傳入的異常絕對不應當被顯式地重新引發 —— 相反地,此方法應當返回一個假值以表明方法已成功完成并且不希望屏蔽被引發的異常。 這允許上下文管理代碼方便地檢測 __exit__() 方法是否確實已失敗。
Python 定義了一些上下文管理器來支持簡易的線程同步、文件或其他對象的快速關閉,以及更方便地操作活動的十進制算術上下文。 除了實現上下文管理協議以外,不同類型不會被特殊處理。 請參閱 contextlib 模塊查看相關的示例。
Python 的 generator 和 contextlib.contextmanager 裝飾器提供了實現這些協議的便捷方式。 如果使用 contextlib.contextmanager 裝飾器來裝飾一個生成器函數,它將返回一個實現了必要的 __enter__() and __exit__() 方法的上下文管理器,而不再是由未經裝飾的生成器函數所產生的迭代器。
請注意,Python/C API 中 Python 對象的類型結構中并沒有針對這些方法的專門槽位。 想要定義這些方法的擴展類型必須將它們作為普通的 Python 可訪問方法來提供。 與設置運行時上下文的開銷相比,單個類字典查找的開銷可以忽略不計。
其他內置類型解釋器支持一些其他種類的對象。 這些對象大都僅支持一兩種操作。
模塊模塊唯一的特殊操作是屬性訪問: m.name,這里 m 為一個模塊而 name 訪問定義在 m 的符號表中的一個名稱。 模塊屬性可以被賦值。 (請注意 import 語句嚴格來說也是對模塊對象的一種操作;import foo 不要求存在一個名為 foo 的模塊對象,而是要求存在一個對于名為 foo 的模塊的 (永久性) 定義。)
每個模塊都有一個特殊屬性 dict__。 這是包含模塊的符號表的字典。 修改此字典將實際改變模塊的符號表,但是無法直接對 dict 賦值 (你可以寫 m.__dict__["a"] = 1,這會將 m.a 定義為 1,但是你不能寫 m.__dict = {})。 不建議直接修改 __dict__。
內置于解釋器中的模塊會寫成這樣:
關于這些類型請參閱 對象、值與類型 和 類定義。
函數函數對象是通過函數定義創建的。 對函數對象的唯一操作是調用它: 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 "", line 1, in 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 定義了所有標準內置類型的名稱。
類型以這樣的寫法來表示:
此對象會由不顯式地返回值的函數所返回。 它不支持任何特殊的操作。 空對象只有一種值 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__() []
上一篇文章:Python標準庫---15、內置類型:集合類型、映射類型
下一篇文章:Python標準庫---17、內置異常
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44010.html
摘要:關聯值通常會作為參數被傳遞給異常類的構造器。所有內置異常的基類。此異常僅用于非限定名稱。由內置函數和的方法所引發,用來表示該迭代器不能產生下一項。當一個或函數返回時,將引發一個新的實例,函數返回的值將被用作異常構造器的形參。 上一篇文章:Python標準庫---16、內置類型:上下文管理器類型、其他、特殊屬性下一篇文章:Python標準庫---18、文本處理服務:string 常見的字...
摘要:目前有兩種內置集合類型,和。兩個類的構造器具有相同的作用方式返回一個新的或對象,其元素來自于。要表示由集合對象構成的集合,所有的內層集合必須為對象。目前僅有一種標準映射類型字典。 上一篇文章:Python標準庫---14、內置類型:二進制序列類型 (memoryview)下一篇文章:Python標準庫---16、內置類型:上下文管理器類型、其他、特殊屬性 集合類型 --- set, ...
摘要:對于更高的維度,其長度等于表示的嵌套列表的長度。這是數組在連續表示時將會占用的空間總字節數。該值僅作為參考信息。新版功能一個表明內存是否為的布爾值。新版功能上一篇文章標準庫內置類型二進制序列類型下一篇文章標準庫內置類型集合類型映射類型 上一篇文章:Python標準庫---13、內置類型:二進制序列類型 ( bytes, bytearray)下一篇文章:Python標準庫---15、內置...
摘要:當引用計數為零,則不再需要該對象且可以銷毀。這表明當變量被刪除時引用計數正確的變為零。方法只能在循環被打破后且引用計數已經為零時調用。這兩步的過程允許引用計數或垃圾收集刪除已引用的對象,讓弱引用懸空。這允許在方法設置對象屬性值之前進行處理。 注:原書作者 Steven F. Lott,原書名為 Mastering Object-oriented Python __del__()方法 ...
閱讀 3235·2021-11-23 09:51
閱讀 2480·2021-09-27 13:34
閱讀 2464·2021-09-08 09:45
閱讀 662·2019-08-30 15:44
閱讀 3493·2019-08-29 12:17
閱讀 2759·2019-08-26 12:18
閱讀 2622·2019-08-26 10:10
閱讀 3078·2019-08-23 18:02