《從python開始學(xué)編程》第6章

目錄

1.一切皆對象
2.屬性覆蓋機制
3.特殊屬性
4.__getattr__()方法
5.動態(tài)類型
6.內(nèi)存管理


1.一切皆對象

列表list的屬性中有一種特殊的方法__add__(),它可以使兩個list的對象相加,如[1, 2, 3]+[4, 5, 6]實質(zhì)是運行了[1, 2, 3]__add__([4, 5, 6]),結(jié)果為[1, 2, 3, 4, 5, 6]。類似的特殊方法還有:__mul__()表示乘法楞陷,__or__()表示or搏色。在這里需要注意温治,列表在python中不可以相減,但我們 可以通過__sub__()方法來添加減法操作的定義,如

__sub__()的方法被重新定義為減法

除了列表的運算實質(zhì)是運用特殊的方法外肥照,列表中元素的引用也用到了特殊方法__getitem__(),如[1, 2, 3, 4, 5].__getitem__(3),就是從列表中引用第四個元素勤众。此外舆绎,關(guān)于列表或者字典元素的操作的方法還有

與運算符類似,許多內(nèi)置函數(shù)也都調(diào)用了對象的特殊方法们颜,比如__len__()吕朵、__abs__()、__int__()等窥突。


2.屬性覆蓋機制

之前在繼承中提到python的屬性覆蓋原理努溃,它實際上運用到了__dict__()方法,它是一個詞典阻问,鍵為屬性名梧税,對應(yīng)的值為某個屬性,看一個例子

輸出結(jié)果為

未截全所有結(jié)果

通過運用__dict__()方法可以看到称近,每個對象或者類中的屬性都儲存在一個字典中第队,如果我們用dir函數(shù)查看對象summe的屬性話,回發(fā)現(xiàn)summer的屬性分成了四層:summer/Chicken/Bird/object刨秆,當我們需要調(diào)用屬性的時候凳谦,python會一層層往下遍歷,知道找到那個屬性為止衡未,這也是屬性覆蓋的原理所在尸执。

注意,如果是對對象屬性進行賦值缓醋,那么python不會分層深入查找如失,以新的Chicken類的對象autumn為例

可以看到,對autumn的屬性賦值改衩,python在自身的__dict__()中找不到對應(yīng)的屬性就會直接在__dict__()中增加岖常,不會影響B(tài)ird類的屬性。


3.特殊屬性

如果屬性A會隨屬性B而變化葫督,那么屬性A就是一個特殊屬性(特性property)竭鞍,比如在Chicken類增加一個表示成年與否的特性adult板惑,當對象age大于1時,adult為真:

property()最多可以加載四個參數(shù)偎快,前三個參數(shù)為函數(shù)冯乘,分別用于設(shè)置獲取、修改和刪除特性晒夹,最后一個參數(shù)為特性的文檔裆馒,可以為一個字符串,起說明作用丐怯。再看一個例子


4.__getattr__()方法

在通過__dict__()方法無法調(diào)取對象屬性時喷好,python會調(diào)用__getattr__()方法來即時生成該屬性,如

需要注意的是读跷,__getattr__()只能用于查詢不在__dict__系統(tǒng)中的屬性梗搅。此外,__setattr__(self, name, value)和__delattr__(self, name)可用于修改和刪除屬性效览。它們的應(yīng)用面更廣无切,可用于任意屬性。


5.動態(tài)類型

動態(tài)類型(Dynamic Typing)是Python的另一個重要核心概念丐枉。變量的賦值就是動態(tài)類型的體現(xiàn)哆键。對a = 1,我們可以用id()函數(shù)查看對象的編號

1和a的編號相同

在這里瘦锹,可以隨時變化的變量名就是可以變更指向的引用籍嘹,比如我們可以用b = a來變更指向,使得b也可以引用1沼本。這時噩峦,如果把a變更為a+2,那么a就變成指向3了抽兆,但是b還是指向1识补,如圖

也就是對象1沒有被改變

可以看出,改變一個引用辫红,并不會影響其它引用的指向凭涂,也就是各個引用各自獨立,互不影響贴妻。但有種情況需要注意:

list1和list2一樣

其實切油,這種情況的實際上表示的是我們通過list1[0]改變了列表里面的元素對象,并沒有改變列表對象名惩,list1和list2還是原來那個list1和list2澎胡。

函數(shù)中參數(shù)的傳遞也是一種引用的傳遞,當調(diào)用函數(shù)時,參數(shù)a傳遞給函數(shù)攻谁,函數(shù)中的變量x就指向了參數(shù)a所指的對象(相當于賦值)稚伍。如果參數(shù)是不可變對象,那么引用參數(shù)a和變量x直接相互獨立戚宦,互不影響个曙。如果傳遞的是可變對象,則不同受楼,如


6.內(nèi)存管理

語言的內(nèi)存管理是語言設(shè)計的一個重要方面垦搬。對象內(nèi)存管理是基于對引用的管理。我們可以用標準庫中sys包中的getrefcount()來查看某個對象的引用次數(shù)艳汽。因為參數(shù)傳遞實際上是創(chuàng)建了一個臨時的引用猴贰,所以getrefcount()的結(jié)果會比期望多1.如a = [1, 2, 3]中,a的引用計數(shù)是2骚灸,b = a糟趾,b的引用計數(shù)是3。如果是a = [1,2,3],b = [a, a],則a的引用計數(shù)是4甚牲。

兩個對象或者對象自身之間可以相互引用,這樣就構(gòu)成了引用環(huán)(Reference Cycle)蝶柿。引用環(huán)會給垃圾回收機制帶來很大麻煩丈钙。垃圾回收機制就是當無用的對象達到一定條件時,需要對無用的對象進行垃圾回收以釋放內(nèi)存交汤,其原理是某個對象的引用計數(shù)降為0雏赦,即沒有任何引用指向該對象時,它就成為了要被回收的垃圾芙扎。

在python運行時星岗,當分配對象(Object Allocation)和取消分配對象(Object Deallocation)的次數(shù)的差值高于某個閾值時,垃圾回收機制會啟動戒洼,可以通過gc模塊的get_threshold()方法俏橘,查看該閾值:

上面的700就是啟動回收機制的閾值,后面兩個10是與分代回收相關(guān)的閾值圈浇。所謂分代回收也是python回收的一種策略寥掐,python將所有對象按存活時間分為0,1磷蜀,2三代召耘,最新的對象為0代,0代的對象經(jīng)過一定次數(shù)的回收后褐隆,存活下來的對象會進入1代污它,python對0代和1代的對象進行回收,如此類推。這里的“一定次數(shù)”就是上圖的兩個10衫贬,表示每10次0代垃圾回收蜜宪,會配合1次1代的垃圾回收,而每10次1代的垃圾回收祥山,才會有1次2代的垃圾回收圃验。對于垃圾回收機制的閾值,我們可以用set_threshold()來調(diào)整缝呕。

上面還說到澳窑,引用環(huán)的垃圾回收比較復(fù)雜,因為組成引用環(huán)的兩個對象的引用計數(shù)都沒有降到0供常,python不會對它進行正常的回收摊聋。python的處理方法是:復(fù)制每個對象的引用計數(shù)(以2個對象a、b為例)栈暇,記為gc_ref_a和gc_ref_b麻裁,python開始遍歷所有對象,當遍歷到對象a引用b時源祈,相應(yīng)的gc_ref_b會減少1煎源,同理遍歷到b引用a時也一樣。這樣香缺,沒用的對象a和b最終的計數(shù)會變?yōu)?而被當成垃圾回收手销,其它未變成0的則繼續(xù)被python使用。



代碼見碼云:zun: happy - 碼云 Gitee.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末图张,一起剝皮案震驚了整個濱河市锋拖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌祸轮,老刑警劉巖兽埃,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異适袜,居然都是意外死亡柄错,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門痪蝇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鄙陡,“玉大人,你說我怎么就攤上這事躏啰〕梅” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵给僵,是天一觀的道長毫捣。 經(jīng)常有香客問我详拙,道長,這世上最難降的妖魔是什么蔓同? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任饶辙,我火速辦了婚禮,結(jié)果婚禮上斑粱,老公的妹妹穿的比我還像新娘弃揽。我一直安慰自己,他們只是感情好则北,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布矿微。 她就那樣靜靜地躺著,像睡著了一般尚揣。 火紅的嫁衣襯著肌膚如雪涌矢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天快骗,我揣著相機與錄音娜庇,去河邊找鬼。 笑死方篮,一個胖子當著我的面吹牛名秀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播恭取,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼泰偿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蜈垮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤裕照,失蹤者是張志新(化名)和其女友劉穎攒发,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晋南,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡惠猿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了负间。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片偶妖。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖政溃,靈堂內(nèi)的尸體忽然破棺而出趾访,到底是詐尸還是另有隱情,我是刑警寧澤董虱,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布扼鞋,位于F島的核電站申鱼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏云头。R本人自食惡果不足惜捐友,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望溃槐。 院中可真熱鬧匣砖,春花似錦、人聲如沸昏滴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽影涉。三九已至变隔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蟹倾,已是汗流浹背匣缘。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鲜棠,地道東北人肌厨。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像豁陆,于是被迫代替她去往敵國和親柑爸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一盒音、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內(nèi)容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,746評論 0 10
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,103評論 1 32
  • 1.元類 1.1.1類也是對象 在大多數(shù)編程語言中表鳍,類就是一組用來描述如何生成一個對象的代碼段。在Python中這...
    TENG書閱讀 1,270評論 0 3
  • 有時候我想,如果沒有讀過《正念的奇跡》雄坪,我就不會時刻提醒自己保持正念厘熟,態(tài)度平和。如果沒有讀過《你就是孩子最好的玩具...
    樊登讀書會閱讀 3,028評論 2 13
  • 平時我總是維護著五二班维哈,期末也不例外绳姨,期末更是這樣,上上上上周阔挠,老師們就已經(jīng)正準備復(fù)習(xí)資料飘庄,我決定我們班的平均分一...
    做營銷的小周閱讀 393評論 3 3