摘要:退出運(yùn)行時(shí)上下文并返回一個(gè)布爾值旗標(biāo)來表明所發(fā)生的任何異常是否應(yīng)當(dāng)被屏蔽。除了實(shí)現(xiàn)上下文管理協(xié)議以外,不同類型不會(huì)被特殊處理。其中一些并不會(huì)被內(nèi)置函數(shù)所列出。
上一篇文章:Python標(biāo)準(zhǔn)庫---15、內(nèi)置類型:集合類型、映射類型上下文管理器類型
下一篇文章:Python標(biāo)準(zhǔn)庫---17、內(nèi)置異常
Python 的 with 語句支持通過上下文管理器所定義的運(yùn)行時(shí)上下文這一概念。 此對象的實(shí)現(xiàn)使用了一對專門方法,允許用戶自定義類來定義運(yùn)行時(shí)上下文,在語句體被執(zhí)行前進(jìn)入該上下文,并在語句執(zhí)行完畢時(shí)退出該上下文:
contextmanager.__enter__()進(jìn)入運(yùn)行時(shí)上下文并返回此對象或關(guān)聯(lián)到該運(yùn)行時(shí)上下文的其他對象。 此方法的返回值會(huì)綁定到使用此上下文管理器的 with 語句的 as 子句中的標(biāo)識(shí)符。
一個(gè)返回其自身的上下文管理器的例子是 file object。 文件對象會(huì)從 __enter__() 返回其自身,以允許 open() 被用作 with 語句中的上下文表達(dá)式。
一個(gè)返回關(guān)聯(lián)對象的上下文管理器的例子是 decimal.localcontext() 所返回的對象。 此種管理器會(huì)將活動(dòng)的 decimal 上下文設(shè)為原始 decimal 上下文的一個(gè)副本并返回該副本。 這允許對 with 語句的語句體中的當(dāng)前 decimal 上下文進(jìn)行更改,而不會(huì)影響 with 語句以外的代碼。
contextmanager.__exit__(exc_type, exc_val, exc_tb)退出運(yùn)行時(shí)上下文并返回一個(gè)布爾值旗標(biāo)來表明所發(fā)生的任何異常是否應(yīng)當(dāng)被屏蔽。 如果在執(zhí)行 with 語句的語句體期間發(fā)生了異常,則參數(shù)會(huì)包含異常的類型、值以及回溯信息。 在其他情況下三個(gè)參數(shù)均為 None。
自此方法返回一個(gè)真值將導(dǎo)致 with 語句屏蔽異常并繼續(xù)執(zhí)行緊隨在 with 語句之后的語句。 否則異常將在此方法結(jié)束執(zhí)行后繼續(xù)傳播。 在此方法執(zhí)行期間發(fā)生的異常將會(huì)取代 with 語句的語句體中發(fā)生的任何異常。
傳入的異常絕對不應(yīng)當(dāng)被顯式地重新引發(fā) —— 相反地,此方法應(yīng)當(dāng)返回一個(gè)假值以表明方法已成功完成并且不希望屏蔽被引發(fā)的異常。 這允許上下文管理代碼方便地檢測 __exit__() 方法是否確實(shí)已失敗。
Python 定義了一些上下文管理器來支持簡易的線程同步、文件或其他對象的快速關(guān)閉,以及更方便地操作活動(dòng)的十進(jìn)制算術(shù)上下文。 除了實(shí)現(xiàn)上下文管理協(xié)議以外,不同類型不會(huì)被特殊處理。 請參閱 contextlib 模塊查看相關(guān)的示例。
Python 的 generator 和 contextlib.contextmanager 裝飾器提供了實(shí)現(xiàn)這些協(xié)議的便捷方式。 如果使用 contextlib.contextmanager 裝飾器來裝飾一個(gè)生成器函數(shù),它將返回一個(gè)實(shí)現(xiàn)了必要的 __enter__() and __exit__() 方法的上下文管理器,而不再是由未經(jīng)裝飾的生成器函數(shù)所產(chǎn)生的迭代器。
請注意,Python/C API 中 Python 對象的類型結(jié)構(gòu)中并沒有針對這些方法的專門槽位。 想要定義這些方法的擴(kuò)展類型必須將它們作為普通的 Python 可訪問方法來提供。 與設(shè)置運(yùn)行時(shí)上下文的開銷相比,單個(gè)類字典查找的開銷可以忽略不計(jì)。
其他內(nèi)置類型解釋器支持一些其他種類的對象。 這些對象大都僅支持一兩種操作。
模塊模塊唯一的特殊操作是屬性訪問: m.name,這里 m 為一個(gè)模塊而 name 訪問定義在 m 的符號(hào)表中的一個(gè)名稱。 模塊屬性可以被賦值。 (請注意 import 語句嚴(yán)格來說也是對模塊對象的一種操作;import foo 不要求存在一個(gè)名為 foo 的模塊對象,而是要求存在一個(gè)對于名為 foo 的模塊的 (永久性) 定義。)
每個(gè)模塊都有一個(gè)特殊屬性 dict__。 這是包含模塊的符號(hào)表的字典。 修改此字典將實(shí)際改變模塊的符號(hào)表,但是無法直接對 dict 賦值 (你可以寫 m.__dict__["a"] = 1,這會(huì)將 m.a 定義為 1,但是你不能寫 m.__dict = {})。 不建議直接修改 __dict__。
內(nèi)置于解釋器中的模塊會(huì)寫成這樣:
關(guān)于這些類型請參閱 對象、值與類型 和 類定義。
函數(shù)函數(shù)對象是通過函數(shù)定義創(chuàng)建的。 對函數(shù)對象的唯一操作是調(diào)用它: func(argument-list)。
實(shí)際上存在兩種不同的函數(shù)對象:內(nèi)置函數(shù)和用戶自定義函數(shù)。 兩者支持同樣的操作(調(diào)用函數(shù)),但實(shí)現(xiàn)方式不同,因此對象類型也不同。
更多信息請參閱 函數(shù)定義。
方法方法是使用屬性表示法來調(diào)用的函數(shù)。 存在兩種形式:內(nèi)置方法(例如列表的 append() 方法)和類實(shí)例方法。 內(nèi)置方法由支持它們的類型來描述。
如果你通過一個(gè)實(shí)例來訪問方法(即定義在類命名空間內(nèi)的函數(shù)),你會(huì)得到一個(gè)特殊對象: 綁定方法 (或稱 實(shí)例方法) 對象。 當(dāng)被調(diào)用時(shí),它會(huì)將 self 參數(shù)添加到參數(shù)列表。 綁定方法具有兩個(gè)特殊的只讀屬性: m.__self__ 操作該方法的對象,而 m.__func__ 是實(shí)現(xiàn)該方法的函數(shù)。 調(diào)用 m(arg-1, arg-2, ..., arg-n) 完全等價(jià)于調(diào)用 m.__func__(m.__self__, arg-1, arg-2, ..., arg-n)。
與函數(shù)對象類似,綁定方法對象也支持獲取任意屬性。 但是,由于方法屬性實(shí)際上保存于下層的函數(shù)對象中 (meth.__func__),因此不允許設(shè)置綁定方法的方法屬性。 嘗試設(shè)置方法的屬性將會(huì)導(dǎo)致引發(fā) AttributeError。 想要設(shè)置方法屬性,你必須在下層的函數(shù)對象中顯式地對其進(jìn)行設(shè)置:
>>> 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"
更多信息請參閱 標(biāo)準(zhǔn)類型層級結(jié)構(gòu)。
代碼對象代碼對象被具體實(shí)現(xiàn)用來表示“偽編譯”的可執(zhí)行 Python 代碼,例如一個(gè)函數(shù)體。 它們不同于函數(shù)對象,因?yàn)樗鼈儾话瑢ζ淙謭?zhí)行環(huán)境的引用。 代碼對象由內(nèi)置的 compile() 函數(shù)返回,并可通過從函數(shù)對象的 code 屬性從中提取。 另請參閱 code 模塊。
可以通過將代碼對象(而非源碼字符串)傳給 exec() 或 eval() 內(nèi)置函數(shù)來執(zhí)行或求值。
更多信息請參閱 標(biāo)準(zhǔn)類型層級結(jié)構(gòu)。
類型對象類型對象表示各種對象類型。 對象的類型可通過內(nèi)置函數(shù) type() 來獲取。 類型沒有特殊的操作。 標(biāo)準(zhǔn)庫模塊 types 定義了所有標(biāo)準(zhǔn)內(nèi)置類型的名稱。
類型以這樣的寫法來表示:
此對象會(huì)由不顯式地返回值的函數(shù)所返回。 它不支持任何特殊的操作。 空對象只有一種值 None (這是個(gè)內(nèi)置名稱)。 type(None)() 會(huì)生成同一個(gè)單例。
該對象的寫法為 None。
省略符對象此對象常被用于切片 (參見 切片)。 它不支持任何特殊的操作。 省略符對象只有一種值 Ellipsis (這是個(gè)內(nèi)置名稱)。 type(Ellipsis)() 會(huì)生成 Ellipsis 單例。
該對象的寫法為 Ellipsis 或 ...。
未實(shí)現(xiàn)對象此對象會(huì)被作為比較和二元運(yùn)算被應(yīng)用于它們所不支持的類型時(shí)的返回值。 請參閱 比較運(yùn)算 了解更多信息。 未實(shí)現(xiàn)對象只有一種值 NotImplemented。 type(NotImplemented)() 會(huì)生成這個(gè)單例。
該對象的寫法為 NotImplemented。
布爾值布爾值是兩個(gè)常量對象 False 和 True。 它們被用來表示邏輯上的真假(不過其他值也可被當(dāng)作真值或假值)。 在數(shù)字類的上下文中(例如被用作算術(shù)運(yùn)算符的參數(shù)時(shí)),它們的行為分別類似于整數(shù) 0 和 1。 內(nèi)置函數(shù) bool() 可被用來將任意值轉(zhuǎn)換為布爾值,只要該值可被解析為一個(gè)邏輯值(參見之前的 邏輯值檢測 部分)。
該對象的寫法分別為 False 和 True。
內(nèi)部對象有關(guān)此對象的信息請參閱 標(biāo)準(zhǔn)類型層級結(jié)構(gòu)。 其中描述了棧幀對象、回溯對象以及切片對象等等。
特殊屬性語言實(shí)現(xiàn)為部分對象類型添加了一些特殊的只讀屬性,它們具有各自的作用。 其中一些并不會(huì)被 dir() 內(nèi)置函數(shù)所列出。
object.__dict__一個(gè)字典或其他類型的映射對象,用于存儲(chǔ)對象的(可寫)屬性。instance.__class__
類實(shí)例所屬的類。class.__bases__
由類對象的基類所組成的元組。definition.__name__
類、函數(shù)、方法、描述器或生成器實(shí)例的名稱。definition.__qualname__
類、函數(shù)、方法、描述器或生成器實(shí)例的 qualified name。 3.3 新版功能.class.__mro__
此屬性是由類組成的元組,在方法解析期間會(huì)基于它來查找基類。class.mro()
此方法可被一個(gè)元類來重載,以為其實(shí)例定制方法解析順序。 它會(huì)在類實(shí)例化時(shí)被調(diào)用,其結(jié)果存儲(chǔ)于 __mro__ 之中。class.__subclasses__()
每個(gè)類會(huì)保存由對其直接子類的弱引用組成的列表。 此方法將返回一個(gè)由仍然存在的所有此類引用組成的列表。 例如:
>>> int.__subclasses__() []
上一篇文章:Python標(biāo)準(zhǔn)庫---15、內(nèi)置類型:集合類型、映射類型
下一篇文章:Python標(biāo)準(zhǔn)庫---17、內(nèi)置異常
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/44010.html
摘要:關(guān)聯(lián)值通常會(huì)作為參數(shù)被傳遞給異常類的構(gòu)造器。所有內(nèi)置異常的基類。此異常僅用于非限定名稱。由內(nèi)置函數(shù)和的方法所引發(fā),用來表示該迭代器不能產(chǎn)生下一項(xiàng)。當(dāng)一個(gè)或函數(shù)返回時(shí),將引發(fā)一個(gè)新的實(shí)例,函數(shù)返回的值將被用作異常構(gòu)造器的形參。 上一篇文章:Python標(biāo)準(zhǔn)庫---16、內(nèi)置類型:上下文管理器類型、其他、特殊屬性下一篇文章:Python標(biāo)準(zhǔn)庫---18、文本處理服務(wù):string 常見的字...
摘要:目前有兩種內(nèi)置集合類型,和。兩個(gè)類的構(gòu)造器具有相同的作用方式返回一個(gè)新的或?qū)ο螅湓貋碜杂凇R硎居杉蠈ο髽?gòu)成的集合,所有的內(nèi)層集合必須為對象。目前僅有一種標(biāo)準(zhǔn)映射類型字典。 上一篇文章:Python標(biāo)準(zhǔn)庫---14、內(nèi)置類型:二進(jìn)制序列類型 (memoryview)下一篇文章:Python標(biāo)準(zhǔn)庫---16、內(nèi)置類型:上下文管理器類型、其他、特殊屬性 集合類型 --- set, ...
摘要:對于更高的維度,其長度等于表示的嵌套列表的長度。這是數(shù)組在連續(xù)表示時(shí)將會(huì)占用的空間總字節(jié)數(shù)。該值僅作為參考信息。新版功能一個(gè)表明內(nèi)存是否為的布爾值。新版功能上一篇文章標(biāo)準(zhǔn)庫內(nèi)置類型二進(jìn)制序列類型下一篇文章標(biāo)準(zhǔn)庫內(nèi)置類型集合類型映射類型 上一篇文章:Python標(biāo)準(zhǔn)庫---13、內(nèi)置類型:二進(jìn)制序列類型 ( bytes, bytearray)下一篇文章:Python標(biāo)準(zhǔn)庫---15、內(nèi)置...
摘要:當(dāng)引用計(jì)數(shù)為零,則不再需要該對象且可以銷毀。這表明當(dāng)變量被刪除時(shí)引用計(jì)數(shù)正確的變?yōu)榱恪7椒ㄖ荒茉谘h(huán)被打破后且引用計(jì)數(shù)已經(jīng)為零時(shí)調(diào)用。這兩步的過程允許引用計(jì)數(shù)或垃圾收集刪除已引用的對象,讓弱引用懸空。這允許在方法設(shè)置對象屬性值之前進(jìn)行處理。 注:原書作者 Steven F. Lott,原書名為 Mastering Object-oriented Python __del__()方法 ...
閱讀 3243·2021-11-23 09:51
閱讀 2501·2021-09-27 13:34
閱讀 2482·2021-09-08 09:45
閱讀 680·2019-08-30 15:44
閱讀 3509·2019-08-29 12:17
閱讀 2772·2019-08-26 12:18
閱讀 2638·2019-08-26 10:10
閱讀 3090·2019-08-23 18:02