鍍金池/ 教程/ Python/ 數(shù)據(jù)模型
復(fù)合語(yǔ)句
數(shù)據(jù)模型
完整的語(yǔ)法規(guī)范
執(zhí)行模型
表達(dá)式
導(dǎo)入系統(tǒng)
詞法分析
簡(jiǎn)單語(yǔ)句
頂層組件
介紹

數(shù)據(jù)模型

對(duì)象,值和類(lèi)型

對(duì)象是 Python 的抽象數(shù)據(jù)。在一個(gè)Python程序中,所有數(shù)據(jù)都通過(guò)對(duì)象或?qū)ο笾g的關(guān)系表示。(在某種意義上講,和馮·諾依曼的“存儲(chǔ)程序計(jì)算機(jī)”的模型一致,代碼也是由對(duì)象所表示的。)

每一個(gè)對(duì)象都具有一個(gè)標(biāo)識(shí),一個(gè)類(lèi)型和一個(gè)值。對(duì)象一旦建立,它的表示就永遠(yuǎn)不能改變了;你可以認(rèn)為它是在內(nèi)存中的地址?!?a rel="nofollow" >is’ 運(yùn)算符用來(lái)可以比較兩個(gè)對(duì)象的身份;‘id’ 可以獲得一個(gè)整數(shù)形式的對(duì)象標(biāo)示。

CPython 的實(shí)現(xiàn)細(xì)節(jié):對(duì)于CPython,id(x)x 存儲(chǔ)的內(nèi)存地址。

一個(gè)對(duì)象的類(lèi)型決定了這個(gè)對(duì)象所支持的操作(例如,“有長(zhǎng)度嗎?”),并且還定義了針對(duì)該類(lèi)型對(duì)象的可能值。type() 函數(shù)返回一個(gè)對(duì)象的類(lèi)型(這是一個(gè)對(duì)象本身)。正如它的身份一樣,一個(gè)對(duì)象的類(lèi)型也是不可以改變的。[1]

某些對(duì)象的是可以改變的。那些值可以改變的對(duì)象被認(rèn)為是可變的;那些值不可以改變的對(duì)象一旦創(chuàng)建就被稱(chēng)為不可變的。(屬于不可變對(duì)象的容器在包括有可變對(duì)象的引用時(shí),當(dāng)可變對(duì)象改變了時(shí),其實(shí)是可變的,但仍被看作是可變對(duì)象,因?yàn)樗膶?duì)相機(jī)集合不可變的,所以不可變對(duì)象和值不可變是不完全一樣的,它更加微妙。)一個(gè)對(duì)象的可變性是由它的類(lèi)型來(lái)確定的;例如,數(shù)值,字符串和元組是不可變的,而字典和列表是可變的。

對(duì)象不用顯式地釋放他們;然而,當(dāng)這些對(duì)象變的不能訪問(wèn)時(shí),它們可能當(dāng)做垃圾被收集。一種處理方式是延遲垃圾收集或者完全忽略 —— 這是回收機(jī)制如何實(shí)現(xiàn)的質(zhì)量問(wèn)題,只要求尚能訪問(wèn)的對(duì)象不被回收。

CPython 的實(shí)現(xiàn)細(xì)節(jié):CPython 當(dāng)前實(shí)現(xiàn)使用一個(gè)引用計(jì)數(shù)機(jī)制和一個(gè)可選的循環(huán)垃圾延時(shí)檢測(cè)機(jī)制,只要對(duì)象不可用了,就會(huì)回收大部分這樣的對(duì)象,但不能保證回收中包含有循環(huán)引用。對(duì)于循環(huán)回收的詳細(xì)控制情況,見(jiàn) gc 模塊參考。其他不同的實(shí)現(xiàn)方式在 CPython 中可能會(huì)改變。 當(dāng)對(duì)象變得不能實(shí)現(xiàn)時(shí),不要依賴(lài)對(duì)象可以立馬終結(jié)(所以你需要經(jīng)常明確地關(guān)閉文件)。

注意使用實(shí)現(xiàn)的跟蹤和調(diào)試工具時(shí)可能會(huì)保留本該回收的對(duì)象,也要注意使用語(yǔ)句 ‘try...except’ 也可能保留本該回收的對(duì)象。

有些對(duì)象包含有“外部”資源,像文件或窗口。可以相信在垃圾回收時(shí)這些資源也被釋放,但因?yàn)槔厥詹槐WC一定發(fā)生,這樣的對(duì)象提供了顯式的方法釋放這些資源,通常是用 close() 方法。特別推薦使用這種方法釋放包含外部資源的對(duì)象。‘try...finally’ 和 ‘with’ 提供了這樣的一個(gè)便利途徑。

有些對(duì)象包含了其它對(duì)象的引用;它們叫做容器。容器的例子有元組,列表和字典。引用作為容器值的一部分。大多數(shù)情況下,當(dāng)我們談及一個(gè)容器的值時(shí),我們只是涉及了這個(gè)值,而不是所包含的對(duì)象;但是,當(dāng)我們談及容器對(duì)象的可變性的時(shí)候,就只是涉及被直接包含的對(duì)象的標(biāo)識(shí)了。因此,如果一個(gè)不可變對(duì)象(如元組)包含了一個(gè)可變對(duì)象,那么只要這個(gè)可變對(duì)象的值變了則它的值也就改變了。

類(lèi)型對(duì)對(duì)象的大多數(shù)行為都有影響。甚至在某種程度上對(duì)對(duì)象的標(biāo)識(shí)也有重要的影響:對(duì)于不可變對(duì)象,計(jì)算新值的運(yùn)算符可能實(shí)際上返回的是一個(gè)已經(jīng)存在的具有相同類(lèi)型和值的對(duì)象的引用,對(duì)于可變對(duì)象,只是不允許的。例如,在 a=1; b=1 之后,ab 有可能指向一個(gè)具有值為1的對(duì)象,這依賴(lài)于實(shí)現(xiàn),但 c=[];d=[] 之后, cd 可以保證是保存了兩個(gè)不同的,獨(dú)立的,新創(chuàng)建的空列表。(注意 c=d=[] 是把相同的對(duì)象賦予了 cd 。)

標(biāo)準(zhǔn)類(lèi)型層次

以下是 Python 內(nèi)建類(lèi)型的一個(gè)列表,擴(kuò)展模塊( 用C 語(yǔ)言,Java,或者其他語(yǔ)言寫(xiě)成,取決于實(shí)現(xiàn)方式)可以定義其他類(lèi)型。以后版本的 Python 可能會(huì)在這個(gè)類(lèi)型層次中增加其他類(lèi)型(例如:有理數(shù),高效率存儲(chǔ)的整數(shù)數(shù)組,等等),即使通過(guò)標(biāo)準(zhǔn)庫(kù)將會(huì)提供這些類(lèi)型。

有些類(lèi)型描述中包括了一個(gè)列出“特殊屬性”的段落。他們提供了一些訪問(wèn)實(shí)現(xiàn)的方法而不是作為一般目的使用。這些定義可能會(huì)在未來(lái)改變。

無(wú) None
這個(gè)類(lèi)型具有單一值,也只有一個(gè)對(duì)象有這個(gè)值,這個(gè)對(duì)象可以通過(guò)內(nèi)建名字 None 訪問(wèn)它在許多場(chǎng)合不是無(wú)值,例如它在那些沒(méi)有返回值的函數(shù)中返回,其值為真值。

未實(shí)現(xiàn) NotImplemented
這個(gè)類(lèi)型具有單一值,也只有一個(gè)對(duì)象有這個(gè)值,這個(gè)對(duì)象可以通過(guò)內(nèi)建名字 NotImplemented 訪問(wèn)。如果數(shù)值方法和許多比較方法的操作數(shù)未提供其實(shí)現(xiàn),他們就可能返回這個(gè)值。(解釋器會(huì)試圖擴(kuò)展成其它操作,或者其它退化的擦做,它依賴(lài)于運(yùn)算符)他的真值為真。

更多細(xì)節(jié)見(jiàn) Implementing the arithmetic operations 。

省略 Ellipsis
這個(gè)類(lèi)型具有單一只,也只有一個(gè)對(duì)象有這個(gè)值。這個(gè)對(duì)象可以通過(guò)文字 ... 或者內(nèi)建名字 Ellipsis 訪問(wèn)。其真值為真。

數(shù)值型 nubmbers.Numbers
它們由數(shù)值型字面值生成,或由算術(shù)運(yùn)算和內(nèi)置算術(shù)函數(shù)作為值返回。數(shù)值型對(duì)象是不可變的;一旦創(chuàng)建其值就不可以改變。Python 的數(shù)值型和數(shù)學(xué)上的關(guān)系非常密切,但要受到計(jì)算機(jī)的數(shù)值表達(dá)能力的限制。

Python 對(duì)整數(shù),浮點(diǎn)數(shù)和復(fù)數(shù)區(qū)別對(duì)待:

numbers.Integral
描述了數(shù)學(xué)上的整數(shù)集(正數(shù)和負(fù)數(shù))。

有2種整數(shù)類(lèi)型:

數(shù)值型整數(shù) Integers (int)
數(shù)值型整數(shù)的表示范圍在語(yǔ)言上是無(wú)限制的,只受限于你的內(nèi)存(虛擬內(nèi)存)。對(duì)于以移位和屏蔽為目的的運(yùn)算,數(shù)值型正數(shù)被認(rèn)為是二進(jìn)制的形式,如果是負(fù)數(shù),那么就被轉(zhuǎn)換成二進(jìn)制補(bǔ)碼形式,符號(hào)位向左擴(kuò)展。

布爾型整數(shù) Booleans (bool)
布爾型整數(shù)的真值是用假和真來(lái)表示的。對(duì)于布爾型對(duì)象的值只能通過(guò)表示。布爾類(lèi)型是整數(shù)類(lèi)型的子類(lèi)型,分別用數(shù)值 0 和 1 來(lái)表示,但是當(dāng)返回值的類(lèi)型是字符時(shí),其分別用 "False" 或者 "True" 表示。

整數(shù)表示法的這個(gè)規(guī)則是為了使對(duì)負(fù)數(shù)操作時(shí)盡量有實(shí)際意義。

浮點(diǎn)數(shù) numbers.Real (float)
本類(lèi)型表示了機(jī)器級(jí)的雙精度浮點(diǎn)數(shù)。是機(jī)器的體系結(jié)構(gòu)和C實(shí)現(xiàn)的浮點(diǎn)數(shù)范圍和控制溢出方法屏蔽你不需知道的細(xì)節(jié)。Python 不支持單精度浮點(diǎn)數(shù),使用它的原因通常是減少CPU負(fù)荷和節(jié)省內(nèi)存,但是這一節(jié)省被對(duì)象在Python中的使用開(kāi)銷(xiāo)所抵消,因此沒(méi)有必要支持兩種浮點(diǎn)數(shù)使語(yǔ)言變的復(fù)雜。

復(fù)數(shù) numbers.Complex (complex)
本類(lèi)型描述了一對(duì)機(jī)器級(jí)的雙精度浮點(diǎn)數(shù),在浮點(diǎn)數(shù)中的警告內(nèi)容也適用于復(fù)數(shù)類(lèi)型。復(fù)數(shù) z 的實(shí)部和虛部可以通過(guò)屬性 z.realz.imag 獲得。

有序類(lèi)型 Sequences
本類(lèi)型描述了用非負(fù)數(shù)索引的有限的有序集合。內(nèi)建函數(shù) len() 返回有序類(lèi)型數(shù)據(jù)中的項(xiàng)數(shù)當(dāng)有序類(lèi)型數(shù)據(jù)的長(zhǎng)為 n 時(shí),索引號(hào)為 0,1,...,n-1。有序類(lèi)型數(shù)據(jù) a 中的項(xiàng) i ,可以以 a[i] 表示。

有序類(lèi)型也支持片斷:a[i:j] 可以表示滿(mǎn)足 i <= k < j 的所有項(xiàng) a[k]。在使用這個(gè)表達(dá)式時(shí),它具有相同的有序類(lèi)型,這也隱含著索引重新從0開(kāi)始計(jì)。

有些有序類(lèi)型用第三個(gè)“步驟”參數(shù)來(lái)支持“擴(kuò)展片斷”:a[i:j:k] 選擇所有項(xiàng)的索引 x,其中 x = i + n * k,n >= 0 并且 i <= x < j。

有序類(lèi)型按照可變性分為兩類(lèi):

不可變類(lèi)型 Immutable sequences
一個(gè)不可變對(duì)象一旦建立其值不可能再改變。(如果這個(gè)對(duì)象包括其它對(duì)象的引用,這個(gè)被引用的對(duì)象可以是可變對(duì)象并且其值可以變化;但為該不可變對(duì)象所直接引用的對(duì)象集合是不能變的。)

以下類(lèi)型是不可變類(lèi)型:

字符串 Strings
字符串的序列值體現(xiàn)了 Unicode 的代碼點(diǎn),字符串中所有代碼點(diǎn)的范圍是 U+0000 - U+10FFF。Python 不支持 char 類(lèi)型,相反,每個(gè)代碼的字符串用長(zhǎng)度1表示一個(gè)字符串對(duì)象。內(nèi)建函數(shù) ord() 從字符串轉(zhuǎn)換為代碼點(diǎn)形成一個(gè)整數(shù)的范圍 0 - 10FFFF,chr() 將一個(gè)范圍在 0 - 10FFFF 的整數(shù)對(duì)應(yīng)長(zhǎng)度1的字符串對(duì)象。str.encode() 可以使用給定的明文編碼將 str 轉(zhuǎn)換成 bytes, 并且 bytes.decode() 可以實(shí)現(xiàn)相反轉(zhuǎn)換。

元組 Tuples
元組對(duì)象的項(xiàng)可以是做任意的 Python 對(duì)象。具有兩個(gè)或多個(gè)項(xiàng)的元組是用逗號(hào)分隔開(kāi)表達(dá)式列表,只有一項(xiàng)的列表(獨(dú)元)其項(xiàng)可以后綴一個(gè)逗號(hào)使其成為滿(mǎn)足要求元組要求的表達(dá)式(一個(gè)表達(dá)式本身不能創(chuàng)建一個(gè)元組,因?yàn)閳A括號(hào)本身用于表達(dá)式的分組)。一個(gè)空元組可以以一對(duì)空?qǐng)A括號(hào)表示。

字節(jié) Bytes
字節(jié)對(duì)象是不可變的數(shù)組,每個(gè)項(xiàng)由8位字節(jié)組成,由整數(shù)范圍為 0 <= x < 256 表示。字節(jié)文字(如 b'abc')和內(nèi)建函數(shù) bytes() 可以被用來(lái)構(gòu)建字節(jié)對(duì)象。同時(shí),字節(jié)對(duì)象可以經(jīng)由 decode() 方法被解碼為字符串。

可變對(duì)象 Mutable sequences
可變對(duì)象可以在其創(chuàng)建后改變,其下標(biāo)表示和片斷表示可以作為賦值語(yǔ)句和 del (刪除)語(yǔ)句的對(duì)象。

目前只有一種可變類(lèi)型。

列表 Lists
列表對(duì)象的項(xiàng)可以是任意類(lèi)型的 Python 對(duì)象。列表對(duì)象是在方括號(hào)之間的用逗號(hào)分開(kāi)的表達(dá)式表。(注意,形成長(zhǎng)度為0或者1的鏈表不要求特別的寫(xiě)法)。

字節(jié)數(shù)組 Byte Arrays
字節(jié)數(shù)組對(duì)象是一個(gè)可變的數(shù)組,它們是由內(nèi)建函數(shù) bytearray() 構(gòu)造創(chuàng)建。除了是可變的(和無(wú)序的),字節(jié)數(shù)組以其他方式提供相同的界面和功能不變的字節(jié)對(duì)象。

擴(kuò)展模塊 array 提供一個(gè)額外的可變序列類(lèi)型模板, collections 模塊。

集類(lèi)型 Set types
集類(lèi)型對(duì)象具有無(wú)序性,有限集的獨(dú)一無(wú)二性,和不變性。因此,它們不能被任何下標(biāo)所搜引,然而,它們可以進(jìn)行遍歷,并有內(nèi)建函數(shù) len() 返回遍歷數(shù)。集的常見(jiàn)應(yīng)用包括快速加入測(cè)試,刪除重復(fù)虛了,和計(jì)算數(shù)學(xué)操作,如十字路口,并,差異和對(duì)稱(chēng)查分。

對(duì)于集元素,相同的不變性屬性作為申請(qǐng)字典關(guān)鍵字。注意,數(shù)字類(lèi)型遵從數(shù)字比較的正常規(guī)則:如果兩個(gè)數(shù)字比較后相等(比如11.0),那么會(huì)只有一個(gè)數(shù)字包含在集合里。

目前有兩種原始集類(lèi)型:

集 Sets
這種代表可變的集合,它們是由內(nèi)建函數(shù) set() 構(gòu)建,并且之后可變用多發(fā)方法去修改的,比如 add()。

凍結(jié)集 Frozen sets
這種代表不可變的集合,它們是由內(nèi)建函數(shù) frozenset() 構(gòu)建,由于凍結(jié)集的不可變性以及無(wú)序性 hashable ,它也可以用來(lái)作另外一個(gè)集合的元素或者字典的關(guān)鍵字。

映射類(lèi)型 Mappings
本類(lèi)型描述了可以是由任意類(lèi)型作索引的有限對(duì)象集合。下標(biāo)表示法 a[k] 從映射類(lèi)型對(duì)象中選擇一個(gè)由 k 索引項(xiàng),它們可以用作賦值語(yǔ)句和 del 語(yǔ)句的目標(biāo)。內(nèi)建函數(shù) len() 返回映射對(duì)象的項(xiàng)的個(gè)數(shù)。

當(dāng)前只有一個(gè)內(nèi)置的映射類(lèi)型:

字典 Dictionaries
本類(lèi)型表達(dá)了幾乎是任意類(lèi)型對(duì)象都可作索引的有限對(duì)象集合。不可接受的鍵值僅僅是那些包括有列表和字典的值,或那些是通過(guò)值比較而不是通過(guò)對(duì)象標(biāo)識(shí)符比較的類(lèi)型的值。其原因是字典的高效實(shí)現(xiàn)要求鍵的哈希值保持不變。用于鍵值的數(shù)值型在比較時(shí)使用通常的規(guī)則:如果兩值相等(如:10),那么它們可以互換地索引相同的字典項(xiàng)。

字典是可變的,它們由 ... 語(yǔ)法創(chuàng)建(詳見(jiàn) Dictionary displays )。

擴(kuò)展模塊 dbm.ndbm 和 dbm.gnu 提供了另外的映射類(lèi)型的例子, 同 collections 模塊。

可調(diào)用類(lèi)型 Callable types
這是一個(gè)可用的函數(shù)調(diào)用操作類(lèi)型(詳見(jiàn) Calls),應(yīng)用于:

用戶(hù)自定義函數(shù) User-defined functions
一個(gè)自定義函數(shù)對(duì)象由函數(shù)定義(詳見(jiàn) Function definitions)。創(chuàng)建在函數(shù)調(diào)用時(shí)應(yīng)該與定義時(shí)的形式參數(shù)相同數(shù)目參數(shù)。

特殊屬性:

屬性 意義 -
__doc__ 是函數(shù)的文檔串,如果無(wú)效就是 None,不可以被子類(lèi)繼承 可寫(xiě)
__name__ 是函數(shù)名稱(chēng) 可寫(xiě)
__qualname__ 是函數(shù)的限定名稱(chēng),在版本 3.3. 中的新屬性 可寫(xiě)
__module__ 定義在函數(shù)模塊里的定義,如果無(wú)效就是 None 可寫(xiě)
__defaults__ 一個(gè)元組包含默認(rèn)參數(shù)值,這些參數(shù)是默認(rèn)的,如果沒(méi)有默認(rèn)參數(shù)值就是 None, 可寫(xiě)
__code__ 一個(gè)編譯后的代碼對(duì)象, 可寫(xiě)
__globals__ 是一個(gè)引用,指向保存了函數(shù)的全局變量的字典——如果在函數(shù)所在模塊中定義了全局變量的話, 只讀
__dict__ 包含了支持任意函數(shù)屬性的命名空間, 可寫(xiě)
__closure__ 要么是 None,要么是包括有函數(shù)自由變量綁定的單元的元組, 只讀
__annotations__ 是一個(gè)包含注釋的字典參數(shù),字典的關(guān)鍵字是參數(shù)名字,并且如果有提供的話,返回注釋 return, 可寫(xiě)
__kewdefaults__ 是一個(gè)只包含默認(rèn)關(guān)鍵字的字典, 可寫(xiě)

大部分的“可寫(xiě)”屬性需要檢查分配的值的類(lèi)型。

函數(shù)對(duì)象也支持獲取和設(shè)置任意屬性,它可以被使用,例如,元數(shù)據(jù)功能。常規(guī)屬性一樣用于獲取和設(shè)置這些屬性。注意,當(dāng)前的實(shí)現(xiàn)只支持函數(shù)屬性對(duì)用戶(hù)定義的函數(shù),功能屬性?xún)?nèi)置函數(shù)可能在未來(lái)才會(huì)支持。

關(guān)于函數(shù)的定義可以由它的代碼對(duì)象得到;見(jiàn)下面關(guān)于內(nèi)部對(duì)象的描述。

實(shí)例方法 Instance methods

實(shí)例方法合并了一個(gè)類(lèi),一個(gè)類(lèi)實(shí)例和任何可調(diào)用對(duì)象(一般是用戶(hù)自定義函數(shù))。

特殊的只讀屬性: __self__ 是類(lèi)實(shí)例對(duì)象,__func__ 是函數(shù)對(duì)象; __doc__ 是其方法的文檔(同 __func__.__doc__); __name__ 是方法名(同 __func__.__name__); __modele__ 是定義方法的模塊名,如果無(wú)效則為無(wú) None。

方法也支持訪問(wèn)(不是設(shè)置)的其實(shí)際所調(diào)用的函數(shù)的任意屬性。

如果類(lèi)的屬性是一個(gè)用戶(hù)定義函數(shù)對(duì)象或類(lèi)方法對(duì)象,那么獲得類(lèi)屬性的用戶(hù)可以創(chuàng)建自定義方法對(duì)象(也可能通過(guò)這個(gè)類(lèi)的一個(gè)屬性)。

當(dāng)用戶(hù)自定義方法對(duì)象采用一個(gè)用戶(hù)自定義函數(shù)對(duì)象來(lái)創(chuàng)建時(shí),這個(gè)對(duì)象來(lái)自于它的一個(gè)實(shí)例類(lèi),它的 __self__ 屬性是個(gè)實(shí)例,并且該方法稱(chēng)為是捆綁的。新方法的 __func__ 屬性是原始函數(shù)對(duì)象。

當(dāng)用戶(hù)自定義方法對(duì)象采用另外一個(gè)類(lèi)或?qū)嵗姆椒▽?duì)象創(chuàng)建時(shí),其特性與函數(shù)對(duì)象創(chuàng)建時(shí)相同的,不同之處是這個(gè) __func__ 新類(lèi)的屬性不是原始函數(shù)對(duì)象,而是它的 __func__ 屬性。

當(dāng)調(diào)用實(shí)例方法對(duì)象時(shí),實(shí)際調(diào)用的是函數(shù)( __func__ ),同時(shí)在參數(shù)列表前插入類(lèi)實(shí)例(__self__ )。比如:當(dāng)類(lèi) C 包含了一個(gè)函數(shù)定義 f(),并且 x 是 C 的一個(gè)實(shí)例,調(diào)用 x.f(1) 相當(dāng)于調(diào)用 C.f(x,1)

當(dāng)一個(gè)實(shí)例方法對(duì)象時(shí)由一個(gè)類(lèi)方法對(duì)象衍生而來(lái)時(shí),存儲(chǔ)在 __self__ 的“類(lèi)實(shí)例”實(shí)質(zhì)上將會(huì)是類(lèi)本身,所以不論調(diào)用 x.f(1) 或者 C.f(1) 相當(dāng)于調(diào)用 f(C,1), 其中 f 是實(shí)際函數(shù)。

注意,由函數(shù)對(duì)象轉(zhuǎn)變到實(shí)例方法對(duì)象,每次都會(huì)檢索實(shí)例中的屬性。在某些情況下,卓有優(yōu)化是成效的優(yōu)化是將屬性分配給一個(gè)局部變量并調(diào)用它。同時(shí)應(yīng)注意,這種轉(zhuǎn)變只會(huì)發(fā)生在在用戶(hù)自定義函數(shù)上,檢索其他的可調(diào)用對(duì)象(以及不可調(diào)用對(duì)象)不需要這種轉(zhuǎn)變。同樣重要的是要注意,具有類(lèi)實(shí)例屬性的用戶(hù)自定義函數(shù)不能轉(zhuǎn)換成綁定方法;當(dāng)且僅當(dāng)發(fā)生在函數(shù)是一個(gè)類(lèi)的屬性時(shí)。

生成器函數(shù) Generator functions
一個(gè)使用 yield 的語(yǔ)句(見(jiàn) yield 語(yǔ)句 )的方法或函數(shù),它叫做生成器函數(shù)。這樣的函數(shù),在返回后,通常返回一個(gè)迭代子對(duì)象,一個(gè)可以用于執(zhí)行函數(shù)的對(duì)象。調(diào)用對(duì)象的 iterator.next() 方法會(huì)引起函數(shù)的執(zhí)行,直到其使用 yield 語(yǔ)句返回一個(gè)值。當(dāng)函數(shù)在執(zhí)行到 return 語(yǔ)句時(shí),或在末尾結(jié)束時(shí),會(huì)拋出異常 StopIteration,此時(shí)迭代器也到達(dá)了返回值集合的結(jié)尾。

內(nèi)建函數(shù) Built-in functions
一個(gè)內(nèi)建函數(shù)就是一個(gè) C 函數(shù)的包裝,例如內(nèi)建函數(shù) len() 和 math.sin() (math 是標(biāo)準(zhǔn)的內(nèi)建模塊)。參數(shù)的類(lèi)型和數(shù)目都由C函數(shù)檢測(cè),特殊的只讀屬性:__doc__ 是函數(shù)的文檔串, 或者無(wú)效為無(wú) None; __name__ 是函數(shù)名;__self__ 設(shè)為 None(見(jiàn)下述); __module__ 是模塊名,或者無(wú)效為無(wú) None。

內(nèi)建方法 Built-in methods
這實(shí)際上是內(nèi)建函數(shù)的一個(gè)不同的包裝而已,此時(shí)傳遞給C函數(shù)一個(gè)對(duì)象作為隱含的參數(shù)。例如,內(nèi)建方法 alist.append() 假定 alist 是一個(gè)列表對(duì)象,此時(shí)特殊只讀屬性 __self__ 指定為對(duì)象 alist

類(lèi) Classes
類(lèi)是可調(diào)用的。這些對(duì)象通常是自己的新實(shí)例的工廠,但是變化可能是重寫(xiě) __new__ () 類(lèi)對(duì)象。傳送調(diào)用的參數(shù)到 __new__ (), 而且典型情況是傳送到 __init__ () 來(lái)初始化成新實(shí)例。

類(lèi)實(shí)例 Class Instances
任意類(lèi)實(shí)例可以通過(guò)定義一個(gè) __call__ () 方法類(lèi)去調(diào)用。

模塊 Modules
模塊是 Python 代碼的基本組成單元,并由導(dǎo)入系統(tǒng) import system 創(chuàng)建,可以通過(guò) import 語(yǔ)句或者諸如函數(shù) importlib.import_module() 和內(nèi)建函數(shù) __import__ ()。一個(gè)模塊有一個(gè)名字空間,用字典對(duì)象實(shí)現(xiàn)(在模塊定義中的函數(shù)可以通過(guò) __globals__ 屬性來(lái)訪問(wèn)這個(gè)字典)。把對(duì)屬性的訪問(wèn)翻譯成查找這個(gè)字典。例如,m.x 等價(jià)于 m.__ dict__["x"]。模塊對(duì)象并不包含用來(lái)初始化該模塊的代碼對(duì)象(因?yàn)橐坏┏跏蓟瓿伤筒辉傩枰耍?/p>

屬性的賦值更新模塊的空間名字,例如,m.x = 1 等價(jià)于 m.__dict__ ["x"]`。

特殊只讀屬性:__dict__ 是字典形式的模塊名字空間。

Python 實(shí)現(xiàn)細(xì)節(jié):由于 CPython 清理模塊字典的方式,當(dāng)模塊超出范圍時(shí),即使字典還在引用,字典模塊也將被消除。為避免這種情況發(fā)生,在直接使用字典時(shí)應(yīng)該備份字典或?qū)⑵浔A粼谀K附近。

預(yù)定義的可寫(xiě)屬性: __name__ 是模塊名;__doc__ 是模塊的文檔串,如果無(wú)效即為 None;__file__ 是被裝載模塊的文件路徑名, 因?yàn)镃模塊不提供些屬性,該模塊已連接至解釋器中,對(duì)于那些從共享庫(kù)裝載的模塊,這個(gè)屬性是那些共享庫(kù)的路徑。

自定義類(lèi) Custom classes
自定義類(lèi)類(lèi)型由類(lèi)定義創(chuàng)建(見(jiàn)類(lèi)定義 Class definitions)。一個(gè)類(lèi)有一個(gè)用字典對(duì)象實(shí)現(xiàn)的名字空間,類(lèi)屬性的訪問(wèn)可以轉(zhuǎn)換成對(duì)該字典的查找,例如,C.x 被解釋成 C.__dict__ ["x"]`(雖然有許多允許定位屬性的掛鉤)。當(dāng)屬性名未找到時(shí),查找是深度優(yōu)先的。這種基本類(lèi)搜索使用 C3 方法解析正確行為,即使在‘鉆石’繼承結(jié)構(gòu)那里有多重繼承回到共同祖先的路徑。更多細(xì)節(jié)在 Python 中使用的 C3 MRO,參考隨著 2.3發(fā)布的文檔里 https://www.python.org/download/releases/2.3/mro/

當(dāng)一個(gè)類(lèi)屬性引用(對(duì)于類(lèi) C 說(shuō))應(yīng)該讓步于一個(gè)類(lèi)方法對(duì)象時(shí),它會(huì)變成一個(gè)實(shí)例方法對(duì)象,其屬性__self__ 是 C。當(dāng)它應(yīng)該讓步于一個(gè)靜態(tài)方法對(duì)象時(shí),它會(huì)變成靜態(tài)方法對(duì)象的封裝對(duì)象。見(jiàn)另一種方式的實(shí)現(xiàn)描述 Implementing Descriptors ,從一個(gè)類(lèi)檢索屬性可能不同于那些實(shí)際包含在其字典__dict__。

類(lèi)屬性的賦值會(huì)更新類(lèi)的字典,而不是基類(lèi)的字典。

一個(gè)類(lèi)對(duì)象可以創(chuàng)建(見(jiàn)上),這樣會(huì)產(chǎn)生一個(gè)類(lèi)實(shí)例(下述)。

特殊屬性: __name__ 是類(lèi)名;__module__ 是類(lèi)所定義的模塊名;__dict__ 是包括類(lèi)名字空間的字典; __bases__ 是一個(gè)元組(可能是空或獨(dú)元),包括其基類(lèi),以基類(lèi)列表中他們的排列次序出現(xiàn); __doc__ 是類(lèi)的文檔串,如果無(wú)效,它就是無(wú) None。

類(lèi)實(shí)例 Class instances

類(lèi)實(shí)例可以通過(guò)調(diào)用一個(gè)類(lèi)對(duì)象來(lái)創(chuàng)建,類(lèi)實(shí)例可以有一個(gè)用字典實(shí)現(xiàn)的名字空間,它只由搜索屬性范圍的第一個(gè)結(jié)果構(gòu)成。如果屬性沒(méi)在那找到,并且實(shí)例的類(lèi)有那個(gè)名字的屬性,就繼續(xù)在類(lèi)屬性中尋找。如果找到的是一個(gè)用戶(hù)自定義函數(shù)對(duì)象(而不是其它情況),它被轉(zhuǎn)換成一個(gè)實(shí)例方法對(duì)象,它的` self屬性是個(gè)實(shí)例。 靜態(tài)方法和類(lèi)方法對(duì)象也可以轉(zhuǎn)換,見(jiàn)前文在 “Classes” 中所述。另一種方式,通過(guò)實(shí)例檢索類(lèi)的屬性可能不同于對(duì)象實(shí)際存儲(chǔ)在類(lèi)__ dict中的,見(jiàn) *[Implementing Descriptors](https://docs.python.org/3/reference/datamodel.html#descriptors)* 部分。如果沒(méi)有類(lèi)屬性找到,并且對(duì)象的類(lèi)有方法 [getattr`](https://docs.python.org/3/reference/datamodel.html#object.getattr__) (),那就調(diào)用它來(lái)滿(mǎn)足查找請(qǐng)求。

屬性賦值和刪除會(huì)更新實(shí)例目錄,而不是類(lèi)的字典,如果類(lèi)具有方法 __setattr__ ()__delattr__ (),則它們會(huì)在更新類(lèi)實(shí)例屬性時(shí)調(diào)用,而不是實(shí)例字典直接更新。

類(lèi)實(shí)例可以偽裝成數(shù)字,序列,或者具有方法映射成某些特別的名字。 見(jiàn) Special method names 部分。

特殊屬性: __dict__ 是字典屬性;__class__ 是實(shí)例屬性。

輸入/輸出對(duì)象(或稱(chēng)文件對(duì)象) I/O objects
一個(gè)文件對(duì)象 file object 描述了一個(gè)開(kāi)放的文件。 有多種可用的快捷方式來(lái)創(chuàng)建文件對(duì)象: 內(nèi)建函數(shù) open(),以及 os.open(),os.fdopen(),和套接字對(duì)象方法 makefile() (或許也可以通過(guò)其他擴(kuò)展模塊的函數(shù)或方法)。

對(duì)象 sys.stdin,sys.stdout,和 sts.stderr 被相應(yīng)的初始化成解釋器的標(biāo)準(zhǔn)輸入流,標(biāo)準(zhǔn)輸出流,和標(biāo)準(zhǔn)錯(cuò)誤輸出流;它們都是開(kāi)放文本模式,因此遵循抽象類(lèi) io.TextIOBase 定義的接口。

內(nèi)部類(lèi)型 Internal types
少部分由解釋器內(nèi)部使用的類(lèi)型,開(kāi)放給了用戶(hù)。它們的定義可能會(huì)在未來(lái)的解釋器版本中改變,但都會(huì)在這兒提及。

代碼對(duì)象 Code objects
代碼對(duì)象表達(dá)了字節(jié)編譯過(guò)的可執(zhí)行 Python 代碼,或者叫字節(jié)碼。代碼對(duì)象和函數(shù)對(duì)象的不同在于函數(shù)對(duì)象包括了一個(gè)外在的全局變量引用(其所定義的模塊),而代碼對(duì)象不包括上下文。默認(rèn)參數(shù)值存入函數(shù)對(duì)象中,而代碼對(duì)象則不(因?yàn)樗鼈兊闹涤蛇\(yùn)行時(shí)計(jì)算)。不像函數(shù)對(duì)象,代碼是不可改變的,并且不包括對(duì)可變對(duì)象的引用。

特殊屬性: co name 給出了函數(shù)名;co argument 是位置參數(shù)的數(shù)目(包括有默認(rèn)值的參數(shù));co nlocals 是函數(shù)中局部變量的數(shù)目。co varnames 是一個(gè)包括局部變量名的元組(從參數(shù)名開(kāi)始);co callvars 是一個(gè)元組,包括由嵌套函數(shù)所引用局部變量名;co freevals 包括了既不是局部變量也不是全局變量的;co code 包括了編譯過(guò)的字節(jié)碼指令序列的字符串;co consts 包括字節(jié)碼中使用的字面值的元組;co names 包括字節(jié)碼中使用的名字的元組;co filename 包括著編譯過(guò)的字節(jié)碼文件名;co firstlineno 是函數(shù)首行行號(hào);co lnotab 是一個(gè)字符串,是字節(jié)碼偏移到行號(hào)的映射(詳見(jiàn)解釋器代碼);co stacksize 是所需要的堆棧尺寸(包括局部變量);co flags 是一個(gè)整數(shù),其解釋成為許多解釋器的標(biāo)志。

以下標(biāo)志位由 co _ flags 定義:如果函數(shù)使用 *argument 語(yǔ)法來(lái)接受任意數(shù)目的位置參數(shù),就置位 0x04;如果函數(shù)使用 *keywords 語(yǔ)法來(lái)接受任意數(shù)量的關(guān)鍵字參數(shù),就置位 0x08;如果函數(shù)是個(gè)生成器,就置位 0x20。

未來(lái)功能還聲明(from __future__ import division)在 co _ flages 中使用位表明編譯代碼對(duì)象是否啟用了一個(gè)特定的嵌入式功能:如果編譯函數(shù)啟用了嵌入式功能,則置位 0x2000;而在老版的 Python 中使用位 0x100x1000

在 co _ flages 中的其他為預(yù)留為內(nèi)部使用。

如果一個(gè)代碼對(duì)象描述一個(gè)函數(shù),則 co _ consts 的第一項(xiàng)是該函數(shù)的文檔串,如果未定義,它就是無(wú) None。

堆棧結(jié)構(gòu)對(duì)象 Frame objects
堆棧結(jié)構(gòu)對(duì)象描述了可執(zhí)行結(jié)構(gòu),它們會(huì)在跟蹤回溯對(duì)象中出現(xiàn)(下述)。

特殊只讀屬性:f back 指出前一個(gè)堆棧結(jié)構(gòu)(向著調(diào)用者的方向),如果位于堆棧的底部它就是 None;f code 指出本結(jié)構(gòu)中能執(zhí)行的代碼對(duì)象。f locals 是用于查找局部變量的字典;f globals 用于全局變量;f builtin 用于內(nèi)建名字;f lasti 給出精確的指令(是一個(gè)代碼對(duì)象的字符串的索引)。

特殊可寫(xiě)屬性:f trace 如果非空,就是從每個(gè)源代碼行的開(kāi)始處調(diào)用的函數(shù)(用于調(diào)試器);f lineno 給出行號(hào)——寫(xiě)這個(gè)函數(shù)從內(nèi)部跟蹤的行(只限于最底層堆棧)。調(diào)試器可以通過(guò)編寫(xiě) f _ lineno 實(shí)現(xiàn)跳轉(zhuǎn)命令(即設(shè)置下一條語(yǔ)句)。

堆棧結(jié)構(gòu)對(duì)象支持一種方法:

堆棧結(jié)構(gòu)清除 frame.clear()
這種方法清除所有局部變量的引用。同時(shí),這個(gè)結(jié)構(gòu)堆棧屬于一個(gè)發(fā)生器,那么會(huì)終結(jié)這個(gè)發(fā)生器。這有助有終止堆棧結(jié)構(gòu)對(duì)象循環(huán)(比如,供以后使用異常捕獲和回溯存儲(chǔ))。

如果當(dāng)前結(jié)構(gòu)正在執(zhí)行,上報(bào) RuntimeError。

新版本3.4。

跟蹤回溯對(duì)象 Traceback objects
跟蹤回溯對(duì)象描述一個(gè)異常的?;厮荩櫥厮輰?duì)象在異常發(fā)生時(shí)創(chuàng)建,在展開(kāi)可執(zhí)行堆棧搜索異常處理器時(shí),每個(gè)展開(kāi)層的跟蹤回溯對(duì)象插進(jìn)當(dāng)前跟蹤回溯對(duì)象的前面。在遇到異常處理器時(shí),跟蹤回溯對(duì)象也對(duì)程序有效了。(見(jiàn) try 語(yǔ)句) 它可以由 sys.exc _ info() 返回的元組的第三項(xiàng)訪問(wèn)到。后一種是推薦的接口,因?yàn)樗部梢允褂枚嗑€程的程序中工作良好。當(dāng)程序中未包括適當(dāng)?shù)漠惓L幚砥? 跟蹤回溯對(duì)象就被打印到標(biāo)準(zhǔn)錯(cuò)誤輸出流上。如果工作在交互方式上,它也可以通過(guò) sys.last _ traceback

特殊只讀屬性:tb text 是堆棧的下一層(向著異常發(fā)生的那一層結(jié)構(gòu)),或者如果沒(méi)有下一層,就為 None。 tb frame 指出當(dāng)前層次的可執(zhí)行結(jié)構(gòu);tb lineno 給出異常發(fā)生的行號(hào);tb lasti 指出精確的指令;如果異常發(fā)生在沒(méi)有 except 或 finally 子句匹配的 try 語(yǔ)句中的話,這里的行號(hào)和指令可能與結(jié)構(gòu)中的行號(hào)和指令不同。

片斷對(duì)象 Slice objects
片斷對(duì)象用片段方法 __getitem()__ 來(lái)描述。他們也是通過(guò)內(nèi)建函數(shù) slice() 來(lái)創(chuàng)建。

特殊只讀屬性:start 是下界,step 是上界,step 是步進(jìn)值,如果在片段中忽略了它,就是 None。這些屬性可以是任意類(lèi)型的。

片斷對(duì)象支持一種方法:

片斷索引 slice.indices(self, length)
這個(gè)方法接受一個(gè)整數(shù)參數(shù) length 并計(jì)算片斷信息,切片對(duì)象用于描述 length 項(xiàng)序列。它返回一個(gè)元組包含為三個(gè)整數(shù),分別代表開(kāi)始索引,停止索引啟動(dòng)和偏度的步進(jìn)步長(zhǎng),處理缺失或界外指數(shù)的方式與普通片斷一致。處理缺失或界外索引的方式與普通片斷一致。

靜態(tài)方法對(duì)象 Static method objects
靜態(tài)方法對(duì)象提供一種戰(zhàn)勝上述轉(zhuǎn)換函數(shù)對(duì)象方法。靜態(tài)方法對(duì)象包裝在其他對(duì)象周?chē)?,通常是一個(gè)用戶(hù)定義的方法對(duì)象。當(dāng)一個(gè)靜態(tài)方法對(duì)象從一個(gè)類(lèi)或一個(gè)類(lèi)實(shí)例檢索時(shí),返回的對(duì)象實(shí)際上是包裝對(duì)象,它不受任何進(jìn)一步的轉(zhuǎn)換。它本身并不是調(diào)用靜態(tài)方法對(duì)象,盡管他們通常包裝對(duì)象,但并不能自我調(diào)用。靜態(tài)方法創(chuàng)建的對(duì)象是內(nèi)建函數(shù) staticmethod() 構(gòu)造。

類(lèi)方法對(duì)象 Class method objects
類(lèi)方法的對(duì)象是一個(gè)在其他對(duì)象周?chē)陌b器,就像一個(gè)靜態(tài)方法對(duì)象,它改變從類(lèi)和類(lèi)實(shí)例中檢索的方式。上述的這種類(lèi)方法對(duì)象的方式在“用戶(hù)自定義方法”中有體現(xiàn)。 用內(nèi)建函數(shù) classmethod() 構(gòu)建器來(lái)創(chuàng)建類(lèi)方法對(duì)象。

特殊方法名

一個(gè)類(lèi)可以實(shí)現(xiàn)以特殊句法才調(diào)用的某些操作(例如算術(shù)運(yùn)算,下標(biāo)操作及片斷操作),這是通過(guò)以特殊名字定義方法來(lái)實(shí)現(xiàn)的。這是 Python 的操作符重載方法,允許類(lèi)來(lái)定義自己的行為對(duì)語(yǔ)言操作符。例如,如果一個(gè)類(lèi)定義了的方法名為 __getitem__ (),并且 x 是這個(gè)類(lèi)的實(shí)例,那么 x[i] 就等價(jià)于 type(x).__ getitem__(x,i)。除了所提及的地方,試圖執(zhí)行沒(méi)有適當(dāng)?shù)姆椒ǘx的操作會(huì)引起一個(gè)異常的拋出(典型的 AttributeErrorTypeError)。

當(dāng)實(shí)現(xiàn)一個(gè)模擬任何內(nèi)建類(lèi)型的類(lèi)時(shí),重要的地方在于模擬的程度只要使對(duì)象模擬時(shí)有效就行了。例如,某些有序類(lèi)型的對(duì)象可能在單獨(dú)提取某引起值時(shí)有效,但在使用片斷時(shí)是沒(méi)有意義的。(這樣的一個(gè)例子是在W3C的文檔對(duì)象模型中的NodeList接口。)

基本定制

object.` new(cls[,...]) 在實(shí)例創(chuàng)建調(diào)用時(shí),__ new是一個(gè)靜態(tài)方法(特殊情況下不需要聲明),它要求類(lèi)的實(shí)例作為第一個(gè)參數(shù)。剩余的參數(shù)傳遞到對(duì)象構(gòu)造表達(dá)式(調(diào)用到類(lèi)),new__` 返回值應(yīng)該是一個(gè)新的對(duì)象實(shí)例(通常是 cls 的實(shí)例)。

典型的實(shí)現(xiàn)方式是創(chuàng)建一個(gè)類(lèi)的新實(shí)例,通過(guò)使用具有適當(dāng)參數(shù)的 super(currentclass,cls).` new(cls[, ...]) 調(diào)用超級(jí)類(lèi)的__ new__` ,然后根據(jù)需要,在返回之前修改新創(chuàng)建的實(shí)例。

如果` new返回一個(gè) cls 實(shí)例,那么新實(shí)例的方法__ init` () 將會(huì)像 ``init(self[,...])被調(diào)用, 這時(shí)候,新實(shí)例和剩余的參數(shù)被傳遞給new__ () 相同。

如果` new不返回一個(gè) cls 實(shí)例,那么就不會(huì)調(diào)用這個(gè)新實(shí)例的__ init__` ()。

__new__ 的主要目的是允許子類(lèi)不可變類(lèi)型(如整數(shù),字符或元組)定制實(shí)例創(chuàng)建。也通常覆蓋在自定義原類(lèi)中來(lái)創(chuàng)建自定義類(lèi)。

object.` init(self[, ...]) 實(shí)例在創(chuàng)建(通過(guò)new創(chuàng)建)之后才會(huì)被調(diào)用,但之前返回給調(diào)用者。構(gòu)造函數(shù)的參數(shù)是指?jìng)鬟f表達(dá)式。如果一個(gè)基本類(lèi)具有方法__ init` ()或派生類(lèi)的方法 init__ (),必須顯式的調(diào)用它,以確保實(shí)例部分的基本類(lèi)初始化;比如: BaseClass.__ init__( self, [args...])。

因?yàn)?strong>` new和__ init` 同時(shí)作用來(lái)構(gòu)建對(duì)象 (new__ 創(chuàng)建它,` init來(lái)定制),沒(méi)有 non-'None' 值可能通過(guò)__ init__` 來(lái)返回,這樣做會(huì)導(dǎo)致在運(yùn)行時(shí)上報(bào) Typeerror 。

object.` del` (self)
在實(shí)例被刪掉時(shí)被調(diào)用,也叫作析構(gòu)器。 如果其基類(lèi)也具有 del() 方法,繼承類(lèi)應(yīng)該在其 del() 顯式地調(diào)用它,以保證適當(dāng)?shù)貏h掉它的父類(lèi)部分。注意,在 del() 通過(guò)創(chuàng)建新的引用來(lái)推遲刪除操作是允許的,但這不是推薦的做法。它然后在最后這個(gè)引用刪除時(shí)被調(diào)用。不能保證在解釋器退出時(shí),仍存在的對(duì)象一定會(huì)調(diào)用 del() 方法。

注意: del x 不直接調(diào)用 x.del() —— 前者將引用計(jì)數(shù)減一,而后者僅僅在引用計(jì)數(shù)減到零時(shí)才被調(diào)用。有一些經(jīng)常使用的方法。 可以防止引用計(jì)數(shù)減為零:對(duì)象之間的循環(huán)引用(例如,一個(gè)雙鏈表或一個(gè)具有父結(jié)點(diǎn)和子結(jié)點(diǎn)指針的樹(shù)形數(shù)據(jù)結(jié)構(gòu));對(duì)某函數(shù)堆棧結(jié)構(gòu)上的引發(fā)異常的對(duì)象進(jìn)行引用(跟蹤回溯對(duì)象保存在 sys.exc_info()[2] 是以保持其有效);或者在交互模式下對(duì)某函數(shù)堆棧上的引發(fā)了沒(méi)有處理器的異常的對(duì)象做引用(跟蹤回溯對(duì)象保存在 sys.last_traceback 中以保持其有效)。第一種方法僅能通過(guò)顯式地破壞循環(huán)才能恢復(fù),后兩種情況,可以通過(guò)將 sys.last_traceback 賦給None來(lái)恢復(fù)。僅當(dāng)循環(huán)引用檢測(cè)器選項(xiàng)被允許時(shí)(這是默認(rèn)的)循環(huán)引用才能為垃圾回收機(jī)制所發(fā)覺(jué), 但這只在沒(méi)有相關(guān)的 Python 級(jí)的 del_() 方法時(shí)才會(huì)被清除。關(guān)于 del_() 方法怎樣處理循環(huán)引用的進(jìn)一步信息參見(jiàn) gc 模塊,該處具體地描述了垃圾回收。

告警:因?yàn)檎{(diào)用 del_() 方法的不確定性,在它執(zhí)行時(shí)的異常會(huì)被忽略,而只是在 sys.stderr 打印警告信息。另外,當(dāng)某模塊被刪除,相應(yīng)的 del_() 方法調(diào)用時(shí)(例如,程序退出時(shí)),有些為 del_() 方法所引用的全局名字可能已經(jīng)刪除了。由于這個(gè)原因, del_() 方法應(yīng)該對(duì)其外部要求保持到最小。 Python1.5 可以保證以單下劃線開(kāi)始的全局名字在其它全局名字被刪除之前從該模塊中被刪除;如果沒(méi)有其它對(duì)存在的全局名字的引用,這會(huì)對(duì)確定那些已導(dǎo)入的模塊在調(diào)用 del_() 之后有那些還是有效 的時(shí)是有所幫助的。

object.` repr(self) 由 [repr()](https://docs.python.org/3/library/functions.html#repr) 內(nèi)建函數(shù)調(diào)用或者在串轉(zhuǎn)換(保留引號(hào))時(shí)用來(lái)計(jì)算對(duì)象的“正式說(shuō)明”字符串,盡可能的,這應(yīng)該是一個(gè)能以相同的值重建一個(gè)對(duì)象的有效的 Python 表達(dá)式(在給定的適當(dāng)有環(huán)境下),如果這不 可能的,也應(yīng)該是返回一個(gè)“...某些有用的信息...”形式的字符串。 返回值必須是一個(gè)字符串。如果類(lèi)定義 [repr()](https://docs.python.org/3/library/functions.html#repr) 而不是 [str` ()](https://docs.python.org/3/reference/datamodel.html#object.__str__), 那么當(dāng)一個(gè)“非正式”字符串表示的類(lèi)的實(shí)例是必須的時(shí)候, repr() 也會(huì)被使用。

本函數(shù)典型地用法是用于調(diào)試,所以這個(gè)串表述成詳盡并無(wú)歧義是十分重要的。

object.` str` (self)
str(object) 內(nèi)建函數(shù)調(diào)用,或由 format()print() 語(yǔ)句來(lái)計(jì)算該對(duì)象的“非正式”串描述。返回值必然是個(gè)字符串 string 對(duì)象。

這與 object.` repr` () 是不同的,因?yàn)樗?要求必須為一個(gè)有效的 Python 表達(dá)式:可以采用一個(gè)更通俗或更簡(jiǎn)潔的表述方式。

這種典型的實(shí)現(xiàn)方法可以通過(guò)內(nèi)建類(lèi)型 object 調(diào)用 object.` repr` () 來(lái)定義。

object.` bytes(self) 由 [format()](https://docs.python.org/3/library/functions.html#format) 內(nèi)建函數(shù)(和擴(kuò)展,類(lèi) [str](https://docs.python.org/3/library/stdtypes.html#str) 的 [strformat()](https://docs.python.org/3/library/stdtypes.html#str.format) 方法)調(diào)用,它產(chǎn)生一個(gè)“格式化”對(duì)象的字符串表示。format_spec參數(shù)是一個(gè)包含了要求格式化選項(xiàng)描述的字符串。format_spec參數(shù)的解釋是實(shí)現(xiàn) [format` ()](https://docs.python.org/3/reference/datamodel.html#object.__format__),然而大多數(shù)類(lèi)代表格式化內(nèi)置的類(lèi)型之一,或者使用類(lèi)似的格式化的語(yǔ)法。

詳見(jiàn) Format Specification Mini-Language 標(biāo)準(zhǔn)格式化特征的描述。

它的返回值必須是一個(gè)字符串對(duì)象。

在版本3.4中的改變:如果傳遞一個(gè)空的字符串,對(duì)象本身的` format` 方法會(huì)提出類(lèi)型錯(cuò)誤 TypeError。

object.` lt(self,other) object.__ le` (self,other)
object.
eq__ (self,other)
object.` ne(self,other) object.__ gt` (self,other)
object.
ge__ (self,other)
它們稱(chēng)為“厚比較”方法集, 具體的方法名和相應(yīng)的運(yùn)算符的對(duì)應(yīng)關(guān)系如下: x<y 調(diào)用 x.__ lt(y)x<=y 調(diào)用 ``le(y),x==y 調(diào)用 ``eq(y),x!=y 調(diào)用 ``ne(y),x>y 調(diào)用 ``gt(y)x>=y 調(diào)用 ``ge__(y)。

如果它對(duì)給定的參數(shù)對(duì)沒(méi)有實(shí)現(xiàn)操作, 一個(gè)厚比較方法可以返回 NotImplemented。按照慣例,一個(gè)成功的比較會(huì)返回 FalseTrue。不論如何,這些方法可以返回任何值,因此如果比較操作在布爾型文本中使用(如,if 條件語(yǔ)句),Python 將在值上調(diào)用 bool() 來(lái)決定結(jié)果是真還是假。

有隱含的比較運(yùn)算符之間的關(guān)系。 x==y 為真相并不意味著 x!=y 為假。相應(yīng)的,當(dāng)定義 __eq__ () 時(shí),同時(shí)也應(yīng)該定義 __ne__ (),比便于達(dá)到預(yù)期的操作。見(jiàn)支持自定義比較和可作為字典關(guān)鍵字使用的創(chuàng)建 hashable__hash__ ()。

對(duì)于這些方法是沒(méi)有互換參數(shù))版本的(在左邊參數(shù)不支持該操作, 但右面的參數(shù)支持時(shí)使用)。雖然, `_lt _()__gt__ ()__le__ ()__ge__(), __eq__ ()__ne__ () 看起來(lái)是反函數(shù)。

厚比較方法的參數(shù)并不是非要有。

從一個(gè)根操作自動(dòng)生成命令的操作,見(jiàn) functools.total_ordering()。

object.` hash(self) 由內(nèi)建函數(shù) [hansh()](https://docs.python.org/3/library/functions.html#hash) 調(diào)用,用于操作散列的集合,包括 [set](https://docs.python.org/3/library/stdtypes.html#set),[frozenset](https://docs.python.org/3/library/stdtypes.html#frozenset),以及 [dict](https://docs.python.org/3/library/stdtypes.html#frozenset). [hash` ()](https://docs.python.org/3/reference/datamodel.html#object.__hash__),應(yīng)該返回一個(gè)整數(shù)。 僅有一個(gè)要求,具有相同的值的對(duì)象應(yīng)該有相同的散列值,應(yīng)該考慮以某種方式將散列值與在對(duì)象中比較中起作用的部分聯(lián)系起來(lái)(例如,用排斥或)。

注意:hash() 將返回值從一個(gè)對(duì)象的自定義 下一篇:復(fù)合語(yǔ)句