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

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