1. 創(chuàng)建自己的類

學(xué)習(xí)面向?qū)ο蟮牡谝徊剑褪莿?chuàng)建一個(gè)類。因?yàn)轭愂敲嫦驅(qū)ο蟮幕ython類和其他編程語(yǔ)言(Java、C#等)的類差不多,也需要使用class關(guān)鍵字。下面通過(guò)一個(gè)實(shí)際的例子來(lái)看一下Python類是如何創(chuàng)建的。
本例會(huì)創(chuàng)建一個(gè)類,以及利用這個(gè)類創(chuàng)建兩個(gè)對(duì)象,并調(diào)用其中的方法。

程序運(yùn)行結(jié)果如下圖所示。

從上面的代碼我們可以了解到Python類的如下知識(shí)點(diǎn)。
Python類使用class關(guān)鍵字定義,類名直接跟在class關(guān)鍵字的后面。
類也是一個(gè)代碼塊,所以類名后面要跟著一個(gè)冒號(hào)(:)。
類中的方法其實(shí)就是函數(shù),定義的方法也完全一樣,只是由于函數(shù)定義在類的內(nèi)部,所以為了區(qū)分,將定義在類內(nèi)部的函數(shù)稱為方法。
我們可以看到,每一個(gè)方法的第1個(gè)參數(shù)都是self,其實(shí)這是必須的。這個(gè)參數(shù)名不一定叫self(可以叫abc或任何其他名字),但任意一個(gè)方法必須至少指定一個(gè)self參數(shù),如果方法中包含多個(gè)參數(shù),第1個(gè)參數(shù)將作為self參數(shù)使用。在調(diào)用方法時(shí),這個(gè)參數(shù)的值不需要自己傳遞,系統(tǒng)會(huì)將方法所屬的對(duì)象傳入這個(gè)參數(shù)。在方法內(nèi)部可以利用這個(gè)參數(shù)調(diào)用對(duì)象本身的資源,如屬性、方法等。
通過(guò)self參數(shù)添加的name變量是Person類的屬性,可以在外部訪問(wèn)。本例設(shè)置了person2對(duì)象的name屬性的值,與調(diào)用person2.setName方法的效果完全相同。
使用類創(chuàng)建對(duì)象的方式與調(diào)用函數(shù)的方式相同。在Python語(yǔ)言中,不需要像Java一樣使用new關(guān)鍵字創(chuàng)建對(duì)象,只需要用類名加上構(gòu)造方法(在后面的章節(jié)會(huì)詳細(xì)介紹)參數(shù)值即可。
調(diào)用對(duì)象的方法有兩種方式,一種是直接通過(guò)對(duì)象變量調(diào)用方法,另一種是通過(guò)類調(diào)用方法,并且將相應(yīng)的對(duì)象傳入方法的第1個(gè)參數(shù)。在本例中使用了Person.greet(person2)的方式調(diào)用了person2對(duì)象中的greet方法。
如果使用集成開(kāi)發(fā)環(huán)境,如PyDev、PyCharm,那么代碼編輯器也會(huì)對(duì)面向?qū)ο笥泻芎玫闹С郑纾?dāng)在對(duì)象變量后輸入一個(gè)點(diǎn)(.)后,IDE會(huì)為我們列出該對(duì)象中所有可以調(diào)用的資源,包括方法和屬性,如下圖所示。

2.方法和私有化
Python類默認(rèn)情況下,所有的方法都可以被外部訪問(wèn)。不過(guò)像很多其他編程語(yǔ)言,如Java、C#等,都提供了private關(guān)鍵字將方法私有化,也就是說(shuō)只有類的內(nèi)部方法才能訪問(wèn)私有化的方法,通過(guò)正常的方式是無(wú)法訪問(wèn)對(duì)象的私有化方法的(除非使用反射技術(shù),這就另當(dāng)別論了)。不過(guò)在Python類中并沒(méi)有提供private或類似的關(guān)鍵字將方法私有化,但可以曲線救國(guó)。
在Python類的方法名前面加雙下劃線(__)可以讓該方法在外部不可訪問(wèn)。

如果執(zhí)行上面的代碼,會(huì)拋出如下圖所示的異常信息,原因是調(diào)用了私有化方法method2。

其實(shí)“method2”方法也不是絕對(duì)不可訪問(wèn)。Python編譯器在編譯Python源代碼時(shí)并沒(méi)有將“method2”方法真正私有化,而是一旦遇到方法名以雙下劃線(__)開(kāi)頭的方法,就會(huì)將方法名改成“ClassNamemethodName”的形式。其中ClassName表示該方法所在的類名,“methodName”表示方法名。ClassName前面要加上但單下劃線()前綴。
對(duì)于上面的代碼,Python編譯器會(huì)將“method2”方法更名為“_Personmethod2”,所以在類的外部調(diào)用“method2”方法會(huì)拋出異常。拋出異常的原因并不是“method2”方法被私有化了,而是Python編譯器把“method2”的名稱改為“_Personmethod2”了。當(dāng)我們了解了這些背后的原理,就可以通過(guò)調(diào)用“_Personmethod2”方法來(lái)執(zhí)行“method2”方法。

本例會(huì)創(chuàng)建一個(gè)MyClass類,并定義兩個(gè)公共的方法(getName和setName)和一個(gè)私有的方法(outName)。然后創(chuàng)建了MyClass類的實(shí)例,并調(diào)用了這些方法。為了證明Python編譯器在編譯MyClass類時(shí)做了手腳,本例還使用了inspect模塊中的getmembers函數(shù)獲取MyClass類中所有的成員方法,并輸出方法名。很顯然,“outName”被改成了“_MyClass__outName”。

程序運(yùn)行結(jié)果如下圖所示。

從getmembers函數(shù)列出的MyClass類方法的名字可以看出,“_MyClassoutName”被綁定到了“outName”方法上,我們可以將“_MyClassoutName”看做是“outName”的一個(gè)別名,一旦為某個(gè)方法起了別名,那么原來(lái)的名字在類外部就不可用了。MyClass類中的getName方法和setName方法的別名和原始方法名相同,所以在外部可以直接調(diào)用getName和setName方法。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
文章名稱:Python類與方法的私有化-創(chuàng)新互聯(lián)
本文URL:http://www.chinadenli.net/article22/dccijc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、網(wǎng)站設(shè)計(jì)公司、用戶體驗(yàn)、建站公司、外貿(mào)網(wǎng)站建設(shè)、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容