我們知道python是一門面向?qū)ο蟮木幊陶Z(yǔ)言,而面向?qū)ο蟮木幊谭椒ɡ锩孀罨A(chǔ)的知識(shí)就是類和對(duì)象。接下來(lái)這篇文章我們就來(lái)介紹一下python類,以及它的類的特性和類的方法。
一、什么是類
類(class),作為代碼的父親,可以說它包裹了很多有趣的函數(shù)和方法以及變量,下面我們?cè)囍?jiǎn)單創(chuàng)建一個(gè)吧。
這樣就算創(chuàng)建了我們的第一個(gè)類了。大家可以看到這里面有一個(gè)self,其實(shí)它指的就是類aa的實(shí)例。每個(gè)類中的函數(shù)只要你不是類函數(shù)或者靜態(tài)函數(shù)你都得加上這個(gè)self,當(dāng)然你也可以用其他的代替這個(gè)self,只不過這是python中的寫法,就好比Java 中的this。
二、類的方法
1.靜態(tài)方法,類方法,普通方法
類一般常用有三種方法,即為static method(靜態(tài)方法),class method(類方法)和self(普通方法)。下面我們來(lái)看看他們之間的區(qū)別吧。
從這里可以看出我們的三種方法有一個(gè)共同點(diǎn),那就是既可以在實(shí)例中訪問,也可以直接用類訪問。不同的是,類實(shí)例訪問時(shí)是不會(huì)執(zhí)行init方法的,也就是沒有進(jìn)行初始化。如果用類直接訪問,可以清楚看到它的運(yùn)行軌跡。如果想在一個(gè)方法里調(diào)用其他方法則只需:實(shí)例名.方法名 或者 類名.方法名 即可。
2.安全方法,私有方法,安全變量,私有變量
安全方法一般是為了保護(hù)類的安全性,為了限制訪問權(quán)限而設(shè)立的。一般只需在方法前加單下劃線即可,那么私有方法怎么訪問呢?和其他方法訪問方法一樣。
安全方法:可以在外部進(jìn)行調(diào)用并且其他方法也能訪問到,它允許本身的任何方法進(jìn)行訪問,并可在外部調(diào)用,安全屬性也是;
私有方法:只能在私有方法內(nèi)部調(diào)用,不能通過類名或者類的實(shí)例名來(lái)調(diào)用,所以你可以在其他方法中通過self.ww來(lái)調(diào)用或者cls.ww來(lái)調(diào)用,這樣就做到了私有的功能。
三、類的特性
類的特性,相信接觸過面向?qū)ο蟮男』锇閼?yīng)該都知道,封裝、繼承和多態(tài)。
1.封裝
講的就是將一個(gè)功能封裝到類中,這個(gè)很好理解。
2.繼承
就是一個(gè)類和另一個(gè)類的主體結(jié)構(gòu)一致,就好比父親和兒子的區(qū)別,兒子繼承父親所有的特點(diǎn),這使得他可以少做一些重復(fù)勞動(dòng),并且他還有自己的一套,這就叫繼承,下面我們通過實(shí)例說明:
可以看出我們實(shí)現(xiàn)了繼承,就是簡(jiǎn)單的在子類中添加了父類的名字,并且寫了個(gè)spuer,用來(lái)繼承父類的所有的特性。雖然父類的所有東西我們都能繼承,但并不是說所有的你都能用的,比如說父類的私有方法或者私有屬性:
那么如果你想要使用它們那該怎么辦呢?很簡(jiǎn)單,你只需將私有方法或者屬性添加到父類某個(gè)可以公開訪問的類中,然后子類就能使用這些父類定義的私有方法或者屬性了。
當(dāng)然,除了單一繼承,還有多繼承,它可以繼承兩個(gè)類的所有屬性和方法,只不過寫法與其他編程語(yǔ)言有點(diǎn)不同,它的多繼承就是遞歸繼承,不能同時(shí)繼承,也就是:
這樣就實(shí)現(xiàn)了多繼承,多繼承可以大大簡(jiǎn)化代碼量。我們可以通過一些魔法方法來(lái)獲得父類的名稱以及說明。
__bases__ #查看類的所有父類 __base__ #查看類的父類 __doc__ #查看類的使用文檔,在類中以三引號(hào)擴(kuò)起來(lái)的部分都是文檔內(nèi)容
我們注意到,只需繼承一個(gè)類就實(shí)現(xiàn)了多繼承,這是因?yàn)閟on類之前繼承過father類,所以現(xiàn)在你必須通過son類繼承father類,后面給它初始化,如果是兩個(gè)沒有任何關(guān)聯(lián)的類,則需要寫兩個(gè)類名進(jìn)去,并且初始化。
3.多態(tài)
多態(tài)的應(yīng)用使得類更靈活,它可以共享某個(gè)方法,給所有的類對(duì)象使用。我們來(lái)看看:
這里是通過對(duì)一個(gè)函數(shù)傳一個(gè)對(duì)象,使得它擁有了類的特征功能,這也就是鴨子類型。
4.動(dòng)態(tài)修改值
當(dāng)一個(gè)類需要大量創(chuàng)建實(shí)例時(shí),可以通過魔法方法slots來(lái)聲明。這樣可以減少內(nèi)存消耗。但是它只是動(dòng)態(tài)的修改,并沒有綁定到類的實(shí)例中,而且類只能訪問slots里設(shè)定的值。
可以看到訪問不了值,因?yàn)闆]有這個(gè)屬性,我們?cè)賮?lái)看看沒slots的時(shí)候:
現(xiàn)在正常了,另外,子類的slots為它本身和父類的slots,父類只是本身。這樣極大省內(nèi)存,但是這樣好像還不夠Python,因?yàn)樗木窒扌?,讓我決定使用property。property有兩種創(chuàng)建方式,我們來(lái)看看:
裝飾器
直接在方法上運(yùn)用裝飾器,十分方便。他有設(shè)置,獲取,刪除三個(gè)屬性,例如:
可以看到,非常簡(jiǎn)單就實(shí)現(xiàn)了功能,少寫了很多代碼哦。
在類中定義值為property對(duì)象的類屬性
使用property函數(shù)來(lái)實(shí)現(xiàn):
可以看到,這樣就實(shí)現(xiàn),那么現(xiàn)在我們寫一個(gè)稍微復(fù)雜點(diǎn)的,可以進(jìn)行交互的動(dòng)態(tài)修改屬性吧。
可以看到,我輸入屬性名和屬性值,如果你想做的更好,可以給它加其他功能,比如私有方法私有屬性,訪問其他類。總之功能多多,需要你自己動(dòng)手親自實(shí)踐。
四、總結(jié)
通過對(duì)類的解讀,讓大家明白了,代碼的簡(jiǎn)潔美觀有多重要,為了我們的程序不那么low,請(qǐng)學(xué)好類。
到此這篇有關(guān)python類的知識(shí)點(diǎn)的詳細(xì)介紹就介紹到這了,更多Python面向?qū)ο缶幊谭椒ㄕ?qǐng)搜索W3Cschool以前的文章或繼續(xù)瀏覽下面的相關(guān)文章!