本篇博客是滾雪球?qū)W Python 第二輪的最后一篇博客,我們將內(nèi)容繼續(xù)提升到面向?qū)ο蟛糠?,為你補(bǔ)充類里面的一些裝飾器,學(xué)習(xí)之后,希望你的 Python 基礎(chǔ)知識可以更上一層樓。
襄城網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,襄城網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為襄城千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請找那個(gè)售后服務(wù)好的襄城做網(wǎng)站的公司定做!
先直接看代碼,再對代碼內(nèi)容進(jìn)行分析與學(xué)習(xí)。
首先要掌握的是類函數(shù)的定義格式,在普通函數(shù)的前面添加裝飾器 @classmethod ,該函數(shù)就會轉(zhuǎn)換為類函數(shù),同時(shí)函數(shù)的第一個(gè)參數(shù)默認(rèn)是 cls ,該變量名可以任意,建議使用成 cls ,這個(gè)是程序員之間的約定。
在 Python 中,大部分 @classmethod 裝飾的函數(shù)末尾都是 return cls(XXX) , return XXX.__new__ () 也就是 @classmethod 的一個(gè)主要用途是作為構(gòu)造函數(shù)。
先掌握一個(gè)概念,靜態(tài)函數(shù)不屬于它所在的那個(gè)類,它是獨(dú)立于類的一個(gè)單獨(dú)函數(shù),只是寄存在一個(gè)類名下,先建立這個(gè)基本概念,后面學(xué)起來就簡單很多了。
在同一個(gè)類中,調(diào)用靜態(tài)方法,使用 類名.函數(shù)名() 的格式。
先創(chuàng)建一個(gè)父類,其中包含兩個(gè)靜態(tài)函數(shù)與一個(gè)類函數(shù)。
再編寫一個(gè) S 類繼承自 F 類:
測試之后,基本結(jié)論如下:
如果在子類中覆蓋了父類的靜態(tài)函數(shù),那調(diào)用時(shí)使用的是子類自己的靜態(tài)函數(shù),
如果在子類中沒有覆蓋父類的靜態(tài)函數(shù),那調(diào)用時(shí)使用的是父類的靜態(tài)函數(shù),
類函數(shù)同樣遵循該規(guī)則。
如果希望在子類中調(diào)用父類的屬性或者函數(shù),請使用 父類名. 的形式實(shí)現(xiàn)。
被 @abstractmethod 裝飾的函數(shù)為抽象函數(shù),含抽象函數(shù)的類不能實(shí)例化,繼承了含抽象函數(shù)的子類必須覆蓋所有抽象函數(shù)裝飾的方法,未被裝飾的可以不重寫。
抽象類是一個(gè)特殊的類,它的特殊之處在于只能被繼承,不能被實(shí)例化,實(shí)現(xiàn)代碼如下:
抽象基類中學(xué)習(xí)還需要了解元類相關(guān)知識,在第三輪滾雪球?qū)W Python 中將為你展開這部分內(nèi)容。
在 Python 面向?qū)ο蟮木幋a過程中, 對象.屬性 來獲取屬性的值,使用 對象.方法() 來調(diào)用方法,通過裝飾器 @property 可以將一個(gè)方法偽裝成屬性,從而使用 對象.方法 沒有括號的形式調(diào)用。代碼非常簡單:
這種寫法最直接的應(yīng)用,就是將部分屬性變成只讀屬性,例如,上述代碼,你無法通過下述代碼對 name 進(jìn)行修改。
如果希望方法偽裝的屬性具備修改和刪除功能,需要參考下述代碼:
上述代碼在將 name 方法偽裝成屬性之后,可以通過 @name.setter 和 @name.deleter 對同名的 name 方法進(jìn)行裝飾,從而實(shí)現(xiàn)了修改與刪除功能。
所以一般使用方法偽裝屬性的步驟是:
如果你覺得這個(gè)比較麻煩,還存在一種方法偽裝屬性的方式。使用 property 函數(shù),原型如下
通過上述函數(shù)將方法偽裝成屬性的代碼為:
滾雪球?qū)W Python 第二輪 15 篇博客在一次結(jié)束了,下一輪將在 4 月中旬再次開啟,學(xué) Python 我們一直在路上,希望本系列的課程對你的 Python 學(xué)習(xí)有所助力。
已有字符串形式的函數(shù)名稱,那么如何調(diào)用這個(gè)函數(shù)呢?
通過調(diào)用內(nèi)置函數(shù)locals()和globals()返回的字典對象,就可以可以獲得名稱與對象的映射關(guān)系。其中,locals()僅在全局范圍內(nèi)調(diào)用時(shí)可以獲得函數(shù)對象。 我們來看以下的例子。
需要注意的是,使用上述方法通過字符串調(diào)用函數(shù)時(shí),為了系統(tǒng)的安全,防止執(zhí)行任意函數(shù),需要對函數(shù)名做一些處理,也就是使用統(tǒng)一的前綴為這些函數(shù)命名。例如在上述例子中,使用前綴cmd_+函數(shù)名的形式定義函數(shù)(cmd_help,cmd_sum)。
在傳入函數(shù)名字符串時(shí),只傳入函數(shù)名的后半部分(如"help","sum"),由程序添加前綴后組成完整的函數(shù)名,再調(diào)用該函數(shù)。
對于類的成員函數(shù),則可以使用getattr()獲得類成員函數(shù)。
上述代碼通過字符串調(diào)用了類成員函數(shù),與前一段代碼執(zhí)行的結(jié)果相同。
此外,還可以使用字典將字符串與函數(shù)對應(yīng)起來調(diào)用,缺點(diǎn)就是每增加一個(gè)函數(shù)需要相應(yīng)在字典對象中添加相應(yīng)的鍵值,增加代碼維護(hù)工作量。
以上代碼在Python 3.6以上運(yùn)行通過。
pythonclass成員函數(shù)沒有實(shí)現(xiàn)是因?yàn)椋?/p>
def是定義函數(shù),就是封裝一段代碼,執(zhí)行特定功能。class是定義對象,對象有自己的成員變量和成員函數(shù)。
兩個(gè)方法:
1.Python中靜態(tài)方法的作用就是保證方法里面所使用的屬性和值都是靜態(tài)不變的,使用靜態(tài)方法一般都不會定義參數(shù),因?yàn)殪o態(tài)方法只能夠使用靜態(tài)屬性。python內(nèi)定義靜態(tài)方法的方式為在定義函數(shù)的代碼前加上一個(gè)@staticmethod這樣的標(biāo)識符。
2.一般的類方法在定義之后需要實(shí)例化這個(gè)類才能夠通過類對象點(diǎn)方法的形式去調(diào)用它,但是靜態(tài)方法可以直接通過類名去調(diào)用。因?yàn)闉殪o態(tài)方法就相當(dāng)于是一個(gè)暴露在外部的自定義函數(shù)一樣,只需要使用類名找到它就可以使用了。同時(shí)靜態(tài)方法也能夠去用實(shí)例化之后的類對象對調(diào)用。