自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Python面向?qū)ο罄锍R姷膬?nèi)置成員介紹

開發(fā) 后端
先前我們定義類的時(shí)候,使用到了構(gòu)造函數(shù),在Python里的構(gòu)造函數(shù)書寫比較特殊,他是一個(gè)特殊的函數(shù)__init__,其實(shí)在類里,除了構(gòu)造函數(shù)還有很多其他格式為__XXX__的函數(shù),另外也有一些__xx__的屬性。下面我們一一說下:

好嘞,今天我們繼續(xù)剖析下Python里的類。

[[441842]]

先前我們定義類的時(shí)候,使用到了構(gòu)造函數(shù),在Python里的構(gòu)造函數(shù)書寫比較特殊,他是一個(gè)特殊的函數(shù)__init__,其實(shí)在類里,除了構(gòu)造函數(shù)還有很多其他格式為__XXX__的函數(shù),另外也有一些__xx__的屬性。下面我們一一說下:

構(gòu)造函數(shù)

python面向?qū)ο罄锍R姷膬?nèi)置成員介紹

Python里所有類的構(gòu)造函數(shù)都是__init__,其中根據(jù)我們的需求,構(gòu)造函數(shù)又分為有參構(gòu)造函數(shù)和無慘構(gòu)造函數(shù)。如果當(dāng)前沒有定義構(gòu)造函數(shù),那么系統(tǒng)會(huì)自動(dòng)生成一個(gè)無參空的構(gòu)造函數(shù)。例如:

python面向?qū)ο罄锍R姷膬?nèi)置成員介紹

在有繼承關(guān)系的類中,只要父類被顯示定義,那么子類在創(chuàng)建的時(shí)候就會(huì)調(diào)用父類的構(gòu)造方法創(chuàng)建父類對(duì)象,盡管子類沒有從父類繼承屬性,也會(huì)自動(dòng)被執(zhí)行。例如:

python面向?qū)ο罄锍R姷膬?nèi)置成員介紹

如果子類想從父類繼承獲取屬性,那么需要顯示調(diào)用父類的構(gòu)造函數(shù)才能獲取,否則只能獲取父類方法。例如:

python面向?qū)ο罄锍R姷膬?nèi)置成員介紹

這里我們需要引入一個(gè)新的概念,即函數(shù)重載。在類內(nèi)部,如果存在多個(gè)函數(shù)名相同,函數(shù)參數(shù)不同(個(gè)數(shù)不同、類型不同、順序不同)那么我們稱這幾個(gè)函數(shù)是重載函數(shù),函數(shù)返回值不作為重載的依據(jù)。在java和C++里我們都有類似的概念。但是Python是動(dòng)態(tài)編程語言,其數(shù)據(jù)沒有數(shù)據(jù)類型,因此在類內(nèi)部我們沒法進(jìn)行函數(shù)重載,因此類內(nèi)部不能有同名的多個(gè)方法,所以我們的構(gòu)造方法要么不寫,要么只能寫一個(gè)。如果不寫系統(tǒng)會(huì)自動(dòng)生成一個(gè)空的無參構(gòu)造方法;如果寫了,那么只能調(diào)用該構(gòu)造方法。另外我們?cè)趯W(xué)習(xí)裝飾器的時(shí)候似乎在類內(nèi)部寫了幾個(gè)同名的方法,例如:

python面向?qū)ο罄锍R姷膬?nèi)置成員介紹

那么這幾個(gè)同名方法是重載關(guān)系嗎?不是的,因?yàn)樗麄儾皇峭暾姆椒?,他們一定更要加上@property、@name.setter、@name.deleter限制才是完整的,因此這里不是函數(shù)重載。

析構(gòu)函數(shù)

構(gòu)造函數(shù)是在對(duì)象創(chuàng)建的時(shí)候被自動(dòng)執(zhí)行的,其主要職責(zé)是對(duì)對(duì)象進(jìn)行初始化。析構(gòu)函數(shù)則是在對(duì)象銷毀(執(zhí)行del或被回收)的時(shí)候被自動(dòng)執(zhí)行的,其主要職責(zé)是對(duì)對(duì)象進(jìn)行回收。先前我們沒有寫析構(gòu)方法,那么系統(tǒng)會(huì)自動(dòng)生成一個(gè)空的析構(gòu)函數(shù)。接下來我們就寫一個(gè)析構(gòu)函數(shù)。Python里的析構(gòu)方法名為 __del__。例如:

python面向?qū)ο罄锍R姷膬?nèi)置成員介紹

我們這么調(diào)用:

python面向?qū)ο罄锍R姷膬?nèi)置成員介紹

執(zhí)行為

python面向?qū)ο罄锍R姷膬?nèi)置成員介紹

在這里我們要重點(diǎn)說下python的垃圾回收機(jī)制。

現(xiàn)在程序員對(duì)系統(tǒng)的垃圾回收機(jī)制不是特別關(guān)注,因?yàn)楝F(xiàn)在硬件發(fā)展的很快,我們可用的資源很豐富,服務(wù)器內(nèi)存4G都是小的,可能大多是8G起步,不夠再加。但是對(duì)于一些高端崗位和高精行業(yè),垃圾回收機(jī)制還是很重要的。所以我們?cè)谶@里梳理下python里的垃圾回收機(jī)制。

Python里的垃圾回收機(jī)制以引用計(jì)數(shù)為主。系統(tǒng)會(huì)為每個(gè)對(duì)象分配一個(gè)引用計(jì)數(shù)器,用來記錄當(dāng)前對(duì)象被使用的次數(shù)。既然涉及到計(jì)數(shù),就有加和減的操作。系統(tǒng)規(guī)定,滿足下述條件進(jìn)行計(jì)數(shù)器加1操作:

1.新創(chuàng)建一個(gè)對(duì)象

2.引用一個(gè)對(duì)象

3.對(duì)象作為實(shí)參傳遞。

滿足下述條件進(jìn)行計(jì)數(shù)器減1操作:

1.對(duì)該對(duì)象進(jìn)行del操作

2.該對(duì)象的引用被賦新值

3.對(duì)象退出當(dāng)前作用域(最常見的就是退出函數(shù)作用域)

在python里,我們通過sys.getrefcount(對(duì)象名),來獲取該對(duì)象的當(dāng)前引用計(jì)數(shù)器,注意,首次這里的引用計(jì)數(shù)不一定為1,因?yàn)橛邢到y(tǒng)臨時(shí)引用。只有當(dāng)指向?qū)ο蟮囊糜?jì)數(shù)器變成0(首次的初始值)的時(shí)候,該對(duì)象才會(huì)真的被銷毀,該對(duì)象的析構(gòu)函數(shù)才會(huì)被執(zhí)行。例如:

python面向?qū)ο罄锍R姷膬?nèi)置成員介紹

輸出為

python面向?qū)ο罄锍R姷膬?nèi)置成員介紹

注意,上述首次調(diào)用sys.getrefcount(ad)的時(shí)候的返回值為4 說明當(dāng)前系統(tǒng)有其他的臨時(shí)用用,那么我們最終只要到4了說明就返回初始狀態(tài)了。最后del ad的時(shí)候會(huì)將系統(tǒng)臨時(shí)引用也釋放。我們當(dāng)前的運(yùn)行環(huán)境是win+pycharm。我們?cè)俑南麓a:

python面向?qū)ο罄锍R姷膬?nèi)置成員介紹

輸出為

python面向?qū)ο罄锍R姷膬?nèi)置成員介紹

從上述輸出可以看出,系統(tǒng)對(duì)基本數(shù)據(jù)類型似乎還有其他操作,造成其初始引用計(jì)數(shù)比我們預(yù)期的引用計(jì)數(shù)大。而引用數(shù)據(jù)類型數(shù)據(jù)則是完全在我們預(yù)期的。

只有最終釋放該對(duì)象的時(shí)候(引用計(jì)數(shù)為0的時(shí)候),__del__析構(gòu)方法才會(huì)被執(zhí)行。

__str__方法

先看我們的代碼:

python面向?qū)ο罄锍R姷膬?nèi)置成員介紹

輸出為

python面向?qū)ο罄锍R姷膬?nèi)置成員介紹

我們打印該對(duì)象的時(shí)候,得到是該對(duì)象的內(nèi)存地址,能不能像打印基本數(shù)據(jù)類型的數(shù)據(jù)一樣來打印我們的引用數(shù)據(jù)類型呢?比如說上述類Student應(yīng)該打印他的實(shí)例變量啊。

我們現(xiàn)在提到的__str__方法就是要完成這個(gè)功能的,__str__方法有一個(gè)返回值,這個(gè)返回值就是我們執(zhí)行print的時(shí)候的輸出值,因此我們可以在__str__方法內(nèi)格式化輸出內(nèi)容。例如:

python面向?qū)ο罄锍R姷膬?nèi)置成員介紹

輸出為

python面向?qū)ο罄锍R姷膬?nèi)置成員介紹

從上面的輸出可以看出,我們想輸出格式化引用數(shù)據(jù)類型數(shù)據(jù)的時(shí)候,就要重寫該類里的__str__方法,該方法里你可以設(shè)置當(dāng)前內(nèi)容的輸出內(nèi)容。這個(gè)__str__方法是object類的方法,因?yàn)閜ython里所有類都是直接或者間接從object派生出來的,因此每個(gè)引用數(shù)據(jù)類型都有__str__方法。我們只需要重寫該方法覆蓋父類的方法即可。否則系統(tǒng)會(huì)默認(rèn)去調(diào)用object里的__str__方法。

__dict__

可能有些人說了,我怎么知道我的類有哪些內(nèi)置成員(屬性和方法)呢?比如說上面的__str_我壓根就不知道有這個(gè)方法,我怎么調(diào)用?python類里確實(shí)有個(gè)屬性,可以打印出該類的所有內(nèi)置內(nèi)容。即__dict__。注意這個(gè)__dict__是屬性不是方法,調(diào)用的時(shí)候不要加()

python面向?qū)ο罄锍R姷膬?nèi)置成員介紹

輸出為

python面向?qū)ο罄锍R姷膬?nèi)置成員介紹

為何stu1.__dict__的輸出內(nèi)容較少,而Student.__dict__的輸出內(nèi)容較多呢?因?yàn)閟tu1是對(duì)象,對(duì)于對(duì)象來講,有意義的就是屬性,因?yàn)榉椒ㄊ撬袑?duì)象共享的。而數(shù)據(jù)是自己特有的,執(zhí)行的時(shí)候只需要攜帶當(dāng)前的對(duì)象的地址就可以執(zhí)行該類的方法(即self)。而Student是一個(gè)類,類是有屬性和方法組成的,所以Student.__dict__的輸出稍微多點(diǎn),包括方法和屬性。

如果你想知道該類的父類有哪些內(nèi)置成員,你就打印該類的父類的__dict__屬性即可。例如我們看下Student類的父類object有哪些內(nèi)置成員,如下:

python面向?qū)ο罄锍R姷膬?nèi)置成員介紹

Ojbect.__dict__的輸出稍微長(zhǎng)些,自己打印看下吧,里面肯定有__str__的說明的。

好了,今天我們接觸到了__init__構(gòu)造函數(shù)、__del__析構(gòu)函數(shù)、__str__內(nèi)置函數(shù)、__dict__屬性等,明天我們繼續(xù)剖析面向?qū)ο罄锏钠渌膬?nèi)置成員。

 

責(zé)任編輯:華軒 來源: 今日頭條
相關(guān)推薦

2009-12-17 11:14:50

Ruby on Rai

2011-07-05 16:15:49

面向?qū)ο?/a>

2011-06-28 11:06:16

Scala

2010-03-18 13:43:40

python面向?qū)ο?/a>

2011-07-21 17:19:47

java面向?qū)ο?/a>

2009-08-14 16:01:22

C#面向?qū)ο?/a>

2023-01-10 09:38:09

面向對(duì)象系統(tǒng)

2010-03-15 14:47:19

Python內(nèi)置對(duì)象

2010-02-02 13:15:26

Python類

2010-03-01 17:47:53

Python語言

2010-06-29 14:33:36

UML面向?qū)ο蠼?/a>

2010-03-10 13:25:07

Python面向?qū)ο?/a>

2021-07-02 14:14:14

Python對(duì)象設(shè)計(jì)

2021-07-16 10:23:47

Python設(shè)計(jì)對(duì)象

2010-03-05 14:44:36

Python繼承

2010-02-02 13:22:06

Python面向?qū)ο?/a>

2010-02-26 14:40:15

Python應(yīng)用程序

2019-03-26 10:50:22

Python面向?qū)ο?/a>編程語言

2019-06-13 11:50:41

Python面向?qū)ο?/a>編程語言

2023-01-10 09:06:17

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)