App下載

什么是類(lèi)?詳解Python類(lèi)的相關(guān)知識(shí)!

猿友 2021-07-22 16:20:40 瀏覽數(shù) (3175)
反饋

我們知道python是一門(mén)面向?qū)ο蟮木幊陶Z(yǔ)言,而面向?qū)ο蟮木幊谭椒ɡ锩孀罨A(chǔ)的知識(shí)就是類(lèi)和對(duì)象。接下來(lái)這篇文章我們就來(lái)介紹一下python類(lèi),以及它的類(lèi)的特性和類(lèi)的方法。

一、什么是類(lèi)

類(lèi)(class),作為代碼的父親,可以說(shuō)它包裹了很多有趣的函數(shù)和方法以及變量,下面我們?cè)囍?jiǎn)單創(chuàng)建一個(gè)吧。

創(chuàng)建一個(gè)類(lèi)

這樣就算創(chuàng)建了我們的第一個(gè)類(lèi)了。大家可以看到這里面有一個(gè)self,其實(shí)它指的就是類(lèi)aa的實(shí)例。每個(gè)類(lèi)中的函數(shù)只要你不是類(lèi)函數(shù)或者靜態(tài)函數(shù)你都得加上這個(gè)self,當(dāng)然你也可以用其他的代替這個(gè)self,只不過(guò)這是python中的寫(xiě)法,就好比Java 中的this。

二、類(lèi)的方法

1.靜態(tài)方法,類(lèi)方法,普通方法

類(lèi)一般常用有三種方法,即為static method(靜態(tài)方法),class method(類(lèi)方法)和self(普通方法)。下面我們來(lái)看看他們之間的區(qū)別吧。

類(lèi)的方法

從這里可以看出我們的三種方法有一個(gè)共同點(diǎn),那就是既可以在實(shí)例中訪問(wèn),也可以直接用類(lèi)訪問(wèn)。不同的是,類(lèi)實(shí)例訪問(wèn)時(shí)是不會(huì)執(zhí)行init方法的,也就是沒(méi)有進(jìn)行初始化。如果用類(lèi)直接訪問(wèn),可以清楚看到它的運(yùn)行軌跡。如果想在一個(gè)方法里調(diào)用其他方法則只需:實(shí)例名.方法名 或者 類(lèi)名.方法名 即可。

2.安全方法,私有方法,安全變量,私有變量

安全方法一般是為了保護(hù)類(lèi)的安全性,為了限制訪問(wèn)權(quán)限而設(shè)立的。一般只需在方法前加單下劃線即可,那么私有方法怎么訪問(wèn)呢?和其他方法訪問(wèn)方法一樣。

類(lèi)的方法和變量的調(diào)用權(quán)限

安全方法:可以在外部進(jìn)行調(diào)用并且其他方法也能訪問(wèn)到,它允許本身的任何方法進(jìn)行訪問(wèn),并可在外部調(diào)用,安全屬性也是;

私有方法:只能在私有方法內(nèi)部調(diào)用,不能通過(guò)類(lèi)名或者類(lèi)的實(shí)例名來(lái)調(diào)用,所以你可以在其他方法中通過(guò)self.ww來(lái)調(diào)用或者cls.ww來(lái)調(diào)用,這樣就做到了私有的功能。

三、類(lèi)的特性

類(lèi)的特性,相信接觸過(guò)面向?qū)ο蟮男』锇閼?yīng)該都知道,封裝、繼承和多態(tài)。

1.封裝

講的就是將一個(gè)功能封裝到類(lèi)中,這個(gè)很好理解。

2.繼承

就是一個(gè)類(lèi)和另一個(gè)類(lèi)的主體結(jié)構(gòu)一致,就好比父親和兒子的區(qū)別,兒子繼承父親所有的特點(diǎn),這使得他可以少做一些重復(fù)勞動(dòng),并且他還有自己的一套,這就叫繼承,下面我們通過(guò)實(shí)例說(shuō)明:

類(lèi)的繼承

可以看出我們實(shí)現(xiàn)了繼承,就是簡(jiǎn)單的在子類(lèi)中添加了父類(lèi)的名字,并且寫(xiě)了個(gè)spuer,用來(lái)繼承父類(lèi)的所有的特性。雖然父類(lèi)的所有東西我們都能繼承,但并不是說(shuō)所有的你都能用的,比如說(shuō)父類(lèi)的私有方法或者私有屬性:

類(lèi)的繼承

那么如果你想要使用它們那該怎么辦呢?很簡(jiǎn)單,你只需將私有方法或者屬性添加到父類(lèi)某個(gè)可以公開(kāi)訪問(wèn)的類(lèi)中,然后子類(lèi)就能使用這些父類(lèi)定義的私有方法或者屬性了。

類(lèi)的繼承

當(dāng)然,除了單一繼承,還有多繼承,它可以繼承兩個(gè)類(lèi)的所有屬性和方法,只不過(guò)寫(xiě)法與其他編程語(yǔ)言有點(diǎn)不同,它的多繼承就是遞歸繼承,不能同時(shí)繼承,也就是:

多繼承

這樣就實(shí)現(xiàn)了多繼承,多繼承可以大大簡(jiǎn)化代碼量。我們可以通過(guò)一些魔法方法來(lái)獲得父類(lèi)的名稱以及說(shuō)明。

__bases__  #查看類(lèi)的所有父類(lèi)
__base__  #查看類(lèi)的父類(lèi)
__doc__    #查看類(lèi)的使用文檔,在類(lèi)中以三引號(hào)擴(kuò)起來(lái)的部分都是文檔內(nèi)容

我們注意到,只需繼承一個(gè)類(lèi)就實(shí)現(xiàn)了多繼承,這是因?yàn)閟on類(lèi)之前繼承過(guò)father類(lèi),所以現(xiàn)在你必須通過(guò)son類(lèi)繼承father類(lèi),后面給它初始化,如果是兩個(gè)沒(méi)有任何關(guān)聯(lián)的類(lèi),則需要寫(xiě)兩個(gè)類(lèi)名進(jìn)去,并且初始化。

3.多態(tài)

多態(tài)的應(yīng)用使得類(lèi)更靈活,它可以共享某個(gè)方法,給所有的類(lèi)對(duì)象使用。我們來(lái)看看:

多態(tài)

這里是通過(guò)對(duì)一個(gè)函數(shù)傳一個(gè)對(duì)象,使得它擁有了類(lèi)的特征功能,這也就是鴨子類(lèi)型。

4.動(dòng)態(tài)修改值

當(dāng)一個(gè)類(lèi)需要大量創(chuàng)建實(shí)例時(shí),可以通過(guò)魔法方法slots來(lái)聲明。這樣可以減少內(nèi)存消耗。但是它只是動(dòng)態(tài)的修改,并沒(méi)有綁定到類(lèi)的實(shí)例中,而且類(lèi)只能訪問(wèn)slots里設(shè)定的值。

動(dòng)態(tài)修改

可以看到訪問(wèn)不了值,因?yàn)闆](méi)有這個(gè)屬性,我們?cè)賮?lái)看看沒(méi)slots的時(shí)候:

現(xiàn)在正常了,另外,子類(lèi)的slots為它本身和父類(lèi)的slots,父類(lèi)只是本身。這樣極大省內(nèi)存,但是這樣好像還不夠Python,因?yàn)樗木窒扌裕屛覜Q定使用property。property有兩種創(chuàng)建方式,我們來(lái)看看:

裝飾器

直接在方法上運(yùn)用裝飾器,十分方便。他有設(shè)置,獲取,刪除三個(gè)屬性,例如:

裝飾器

可以看到,非常簡(jiǎn)單就實(shí)現(xiàn)了功能,少寫(xiě)了很多代碼哦。

在類(lèi)中定義值為property對(duì)象的類(lèi)屬性

使用property函數(shù)來(lái)實(shí)現(xiàn):

定義類(lèi)屬性

可以看到,這樣就實(shí)現(xiàn),那么現(xiàn)在我們寫(xiě)一個(gè)稍微復(fù)雜點(diǎn)的,可以進(jìn)行交互的動(dòng)態(tài)修改屬性吧。

動(dòng)態(tài)修改屬性

運(yùn)行結(jié)果

可以看到,我輸入屬性名和屬性值,如果你想做的更好,可以給它加其他功能,比如私有方法私有屬性,訪問(wèn)其他類(lèi)??傊δ芏喽?,需要你自己動(dòng)手親自實(shí)踐。

四、總結(jié)

通過(guò)對(duì)類(lèi)的解讀,讓大家明白了,代碼的簡(jiǎn)潔美觀有多重要,為了我們的程序不那么low,請(qǐng)學(xué)好類(lèi)。

到此這篇有關(guān)python類(lèi)的知識(shí)點(diǎn)的詳細(xì)介紹就介紹到這了,更多Python面向?qū)ο缶幊谭椒ㄕ?qǐng)搜索W3Cschool以前的文章或繼續(xù)瀏覽下面的相關(guān)文章!



0 人點(diǎn)贊