一、?? ?引言
在較舊的Python版本中,類型和類之間涇渭分明:內(nèi)置對(duì)象是基于類型的,而自定義對(duì)象是基于類的。因此,你可以創(chuàng)建類,但不能創(chuàng)建類型。在較新的Python 2版本中,這種差別不那么明顯。在Python 3中,已不再區(qū)分類和類型了,類就是類型,類型就是類,如int型就是class(int)。
首先聲明,除非特殊說明本章所有關(guān)于類的知識(shí)都是基于Python3.73的版本來的,有些內(nèi)容在低版本特別是Python3.0以下的Python中不支持。
二、?? ?語法
1.?? ?創(chuàng)建自定義類的語法
class 類名:
執(zhí)行語句...
零個(gè)到多個(gè)類變量...
零個(gè)到多個(gè)方法...
3、?? ?語法說明:Python 的類定義由類頭(指 class 關(guān)鍵字、類名和冒號(hào))和統(tǒng)一縮進(jìn)的類體構(gòu)成,在類體中最主要的兩個(gè)成員就是類變量和方法。如果不為類定義任何類變量和方法,那么這個(gè)類就相當(dāng)于一個(gè)空類,如果空類不需要其他可執(zhí)行語句,則可使用 pass 語句作為占位符。
1)?? ?class關(guān)鍵字:class為類定義的聲明關(guān)鍵字,類定義創(chuàng)建獨(dú)立的命名空間,用于在其中定義函數(shù)和變量,這些函數(shù)和變量就是類和實(shí)例的方法和屬性;
2)?? ?類名:必須是一個(gè)合法的Python標(biāo)識(shí)符(只能由字母、數(shù)字和下劃線(_)構(gòu)成,且不能以數(shù)字打頭,且下劃線開頭的名稱有特殊含義,一般不使用)。Python推薦的命名規(guī)范,要求類名遵循駝峰命名法,即類名必須是由一個(gè)或多個(gè)有意義的單詞連綴而成的,每個(gè)單詞首字母大寫,其他字母全部小寫,單詞與單詞之間不要使用任何分隔符;
3)?? ?類體:類體與函數(shù)體類似,在類頭后接統(tǒng)一縮進(jìn)的類體,可以有單獨(dú)的類代碼,可以有變量和函數(shù),不過類中的函數(shù)稱為方法;
4)?? ?類定義說明文檔:與函數(shù)文檔字符串類似,Python 也允許為類定義文檔字符串,文檔字符串放在類聲明之后、類體之前,如上面程序中第二行的字符串所示。
從上面定義來看,Python 的類定義有點(diǎn)像函數(shù)定義,都是以冒號(hào)(:)作為類體的開始,以統(tǒng)一縮進(jìn)的部分作為類體的。區(qū)別只是函數(shù)定義使用 def 關(guān)鍵字,而類定義則使用 class 關(guān)鍵字。
三、?? ?類的主要特征
1.?? ?Python 類所包含的最重要的兩個(gè)成員就是變量和方法,類中各成員之間的定義順序沒有任何影響,各成員之間可以相互調(diào)用;
2.?? ?類中定義的方法包括方法則用于定義該類或?qū)嵗龑?duì)象的行為或功能實(shí)現(xiàn),類中的方法包括類方法、靜態(tài)方法和實(shí)例方法。在后面章節(jié)單獨(dú)介紹;
3.?? ?類所包含的變量又分為類變量和實(shí)例變量,類體中定義的變量為類變量,實(shí)例變量是實(shí)例方法中定義的self對(duì)象的變量,對(duì)于每個(gè)實(shí)例都是獨(dú)有數(shù)據(jù),而類變量是該類所有實(shí)例共享的屬性和方法:
1)?? ?類變量屬于類本身,用于定義該類本身所包含的狀態(tài)數(shù)據(jù);
2)?? ?實(shí)例變量則屬于該類的對(duì)象,用于定義對(duì)象所包含的狀態(tài)數(shù)據(jù)。
關(guān)于類變量和實(shí)例變量,在后面章節(jié)單獨(dú)介紹。
4.?? ?在class語句中定義的代碼都是在一個(gè)特殊的命名空間(類的命名空間)內(nèi)執(zhí)行的,而類的所有成員都可訪問這個(gè)命名空間。類定義其實(shí)就是要執(zhí)行的代碼段,類體中的代碼(未在方法中的代碼)在類定義時(shí)執(zhí)行,當(dāng)定義實(shí)例變量時(shí)類體中的代碼不會(huì)再執(zhí)行,這個(gè)與函數(shù)體中的代碼完全不同;
5.?? ?類還可以支持在類體中定義類,不過這種模式使用場(chǎng)景基本沒有,在此不展開說明;
6.?? ?Python中類的構(gòu)造方法是:__init__,構(gòu)造方法用于構(gòu)造該類的對(duì)象,Python 通過調(diào)用構(gòu)造方法返回該類的對(duì)象。構(gòu)造方法在定義實(shí)例對(duì)象時(shí)執(zhí)行,也就是當(dāng)類被實(shí)例化的時(shí)候就會(huì)執(zhí)行該函數(shù),__init__()方法是可選的,如果不提供,Python 會(huì)給出默認(rèn)的__init__方法;
7.?? ?Python中類的析構(gòu)方法是:__del__,當(dāng)使用del 刪除對(duì)象時(shí),會(huì)調(diào)用他本身的析構(gòu)函數(shù),另外當(dāng)對(duì)象在某個(gè)作用域中調(diào)用完畢,在跳出其作用域的同時(shí)析構(gòu)函數(shù)也會(huì)被調(diào)用一次,這樣可以用來釋放內(nèi)存空間。__del__()也是可選的,如果不提供,則Python 會(huì)在后臺(tái)提供默認(rèn)析構(gòu)函數(shù)如果要顯式的調(diào)用析構(gòu)函數(shù),可以使用del關(guān)鍵字,方式如下:del對(duì)象名
8.?? ?Python類所包含的類變量和實(shí)例變量都可以動(dòng)態(tài)增加或刪除:
1)?? ?程序也可在任何地方通過賦值語句為已有的類和實(shí)例增加變量;程序可通過 del 語句刪除己有類的類變量和實(shí)例變量;
2)?? ?程序中可以動(dòng)態(tài)調(diào)整類定義,后定義的類定義將覆蓋原有的類定義;
3)?? ?程序調(diào)整類的類變量、實(shí)例變量和類定義后,已有的類的實(shí)例不受影響,如在類中刪除一個(gè)實(shí)例變量a、類變量c、刪除方法f后,原有的實(shí)例中還能看到a、c、f,同樣新增的類變量、實(shí)例變量、類方法、實(shí)例方法,原有的實(shí)例不能使用。
9.?? ?類中所有方法的全局空間和類本身的全局空間是同一個(gè),但二者的局部名字空間不同。類中所有方法中的局部名字空間與全局名字空間和類本身的局部名字空和全局名字空的關(guān)系與函數(shù)和函數(shù)調(diào)用環(huán)境中局部名字空間和全局名字空間的關(guān)系一樣。
四、?? ?類定義舉例
以上節(jié)介紹的鴨子類進(jìn)行擴(kuò)展來舉例說明類的定義方法:
class Duck():
? print("現(xiàn)在執(zhí)行Duck類類體代碼,開始定義類構(gòu)造函數(shù)")
? def __init__(self):
? ? ?self.sex='公鴨'
? ? ?self.age=1
? ? ?print("構(gòu)造函數(shù)執(zhí)行完畢!")
? print("現(xiàn)在定義walk方法") ? ?
? def walk(self):
? ? print('I walk like a duck')
? print("現(xiàn)在定義swim方法")?
? def swim(self):
? ? print('I swim like a duck')
? print("現(xiàn)在定義quack方法")?
? def quack(self):
? ? print('I quack like a duck')
? print("現(xiàn)在定義類析構(gòu)函數(shù)")
? def __del__(self):
? ? ? print("Duck對(duì)象析構(gòu)函數(shù)執(zhí)行")
? ? ?
? ? 可以看到,類定義時(shí),類體中沒在方法外的代碼全部執(zhí)行,定義實(shí)例對(duì)象時(shí),會(huì)執(zhí)行構(gòu)造函數(shù),實(shí)例回收時(shí)執(zhí)行析構(gòu)函數(shù),但不能直接通過”類名.方法”方式執(zhí)行實(shí)例方法。
? ? ?本節(jié)介紹的相關(guān)知識(shí)都是基于Python3的,實(shí)際上在Python3之前有舊式類和新式類的說法,且在Python 3之前默認(rèn)創(chuàng)建的是舊式類,在較舊的Python版本中,要?jiǎng)?chuàng)建新式類,應(yīng)在腳本或模塊開頭放置賦值語句__metaclass__ = type。當(dāng)然,還有其他解決方案,如從新式類(如object)派生出子類。Python 3,就無需考慮這一點(diǎn),因?yàn)楦緵]有舊式類了。因此關(guān)于這部分內(nèi)容就不展開說了。
? ? Python的類之所以說與眾不同,因?yàn)樗臉?gòu)造方法、析構(gòu)方法、類方法和實(shí)例方法、封裝模式、類體代碼,還有后面要提到或介紹的__new__方法、靜態(tài)方法、裝飾器、動(dòng)態(tài)定義屬性和方法等等,都與很多語言有很大的不同,因此說與眾不同。
本節(jié)介紹了Python中類的語法、構(gòu)成及各部分的特征,有關(guān)內(nèi)容涉及面較廣,如果大家不好理解,建議自己多找點(diǎn)資料看看。
老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介紹老猿學(xué)習(xí)Python后總結(jié)的學(xué)習(xí)經(jīng)驗(yàn),這些經(jīng)驗(yàn)有助于沒有接觸過Python的程序員可以很容易地進(jìn)入Python的世界。
歡迎大家批評(píng)指正,謝謝大家關(guān)注!
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
