Python的面向對象、Class 概念與使用

Class(類)的基本概念:


  • 類:將同一種具體事務的共同點抽象出來的表現,Python的類是一種可調用對象。

  • 類中定義的有方法,變量,數據結構。

  • 變量則是類屬性本身是沒有數據的,只有在實例化的時候將數據引入。

  • 方法就是函數;是操作變量引用的數據的代碼,可以知道方法是操作數據的,由於類中不包含數據,所以類無法調用方法,只有實例化引入數據成爲實例(也稱爲對象)纔可以調用方法。

wKioL1W3YdqgRLUdAAJpUMeMzr4546.jpg

對象的由來:

wKiom1W3U_6wTo4rAABqBLMXMjw257.jpg

  對象(也稱爲實例)本身是沒有方法的,對象引用的方法是在類中定義的也叫類函數,或者叫接口。

同屬一類實例化的對象,具有相同的功能。  


類的執行場景:

當定義一個類時,類中的代碼是不會執行的,只有在實例化時纔會執行。 實例化過程中,類的方法不會執行,只有當實例調用方法的時候纔會執行。


類對象是可調用對象,實例對象則是可以調用其中的方法。


類間關係:

依賴:一個類的方法操作另一個類的對象,如果另外一個類的對象沒有被實例化出來,這個類就無法執行。


聚合:類A的對象包含類B的對象


繼承:描述特殊與一般關係


面向對象的模型機制的3個原則:

封裝(package)

隱藏實現方案細節,將代碼及其處理的數據綁定在一起的一種編程機制,用於保證程序和數據不受外部干擾且不會被誤用。


繼承(Inheritance)

通過繼承,子類對象可以獲得父類對象的屬性,一個深度繼承的子類繼承了類層次中它的每個祖先的所有屬性。 (超類、父類、基類)都是同一個概念

在子類中調用一個屬性的時候,如果在本類中沒有,就會一直向上找父類。


多態性(Polymorphism)

允許一個接口被多個通用的類動作使用的特性,具體使用哪個動作與應用場合相關,相當於一個接口多個方法。

概念理解:對於某一個類而言,當傳遞給它的是不同的數據,卻能完成多鐘不同的運算。爲了實現同一個目的,而定義同一個接口,背後卻有多種不同的實現。 能夠自動判斷調用哪種實現的這種機制就叫做多態。

作用:降低程序的複雜性 


開始一個類程序:

wKiom1W3Y2jD-xxbAAKhg-tD9cw397.jpg


類方法中的這個self是用於標識實例本身的。 任何一個類方法都應該以self開始。


通過實例調用方法相當於調用所屬類的方法來處理當前實例

In [16]: ins1.setdata('hello python class')

In [17]: ins1.printdata()
hello python class

同等於這樣寫

In [20]: TestClass.setdata(ins1,'aabbcc111222333')

In [21]: TestClass.printdata(ins1)
aabbcc111222333


在setdata方法調用之前,MyClass類不會把name屬性附加到實例ins1上,當然也可以重載__init__創建構造器直接爲實例提供。

wKiom1W3Zi7gup3FAAFxzwTS0TE865.jpg


Python 構造函數(別名:構造方法、構造器)

在Python中每一個類都有一個構造器方法__init__,構造方法會在實例化時從類名接受一個參數傳給類方法,這樣就可以直接在類初始化時給方法傳參。


構造器在構造實例時傳參,直接構造實例屬性。 

wKiom1W3Z3LDXBLoAAH_OJbmS8M620.jpg


構造器是創建實例屬性最便捷的方式


__varname__ : 這類方法在某種場景下,Python解釋器會自動調用它們。

當執行 a + b 程序會自動調用 a.__add__(b)

當執行 l2 = [1,2,3] 程序會自動調用 list.__init__()


析構:用於銷燬一個實例,解釋器會自動垃圾回收,所以一般很少用析構函數。

wKiom1W3atGgKcSUAAG9uXk1iN4070.jpg


獲取類中的所有可用屬性和可用方法,可以使用__dict__類的字典屬性,或者內置函數dir。

wKioL1W3bVqCwhcgAAEtQ3Xk-6g291.jpg

-------------------------------------------------------------------------------------------

wKiom1W3a6LCbGTZAAFV59FFboM654.jpg

獲取實例屬性和方法

wKioL1W3bcqyNI1bAAC60lyO2j8947.jpg


方法的可用變量

實例變量:指定變量名稱及實例自身進行引用 self.變量名

局部變量:方法內部創建的變量,可直接使用

類變量(也稱靜態變量):通過指定變量名與類名進行引用 

全局變量:直接使用

wKiom1W3bULjGrzpAAGJqFY4zNo726.jpg


類的繼承

繼承描述了基類的屬性如何"遺傳"給子類,子類可以繼承它的基類的任何屬性,包括數據屬性和方法,一個未指定基類的類,其默認有一個名爲Object的基類,Python允許多重繼承能並行繼承多個父類。

wKiom1W3blPw486IAAD0XjdhrQM687.jpg


實現子類繼承構造方法

wKioL1W3cJ-SDbimAALkSkEpCk4571.jpg


Python中幾乎所有屬性的獲取都可以使用 "object.attribute",的格式。 

此表達式會在Python中啓動搜索—— ——搜索連續的樹

Class 語句會產生一個類對象,對Class的調用會創建實例,實例會自動連接至創建了此實例的類。


類連接至其超類的方式

    繼承就是由下至上,由左至右搜索此樹來尋找屬性名稱所出現的最低的位置。

wKiom1W3b4vgJ5rfAABJjv6pAgQ952.jpg


繼承方法的專用化

繼承會先在子類尋找變量名,然後才查找超類,因此,子類可以對超類的屬性覆蓋來取代繼承而來的方法。也可以通過已覆蓋的方法回調超類來擴展超類的方法

wKiom1W3cGLQl77PAAHsWCF0uyE785.jpg

類、實例和其他對象的內建函數

issubclass()

布爾函數,判斷一個類是否是另一個類的子類

In [38]: issubclass(Two_Class,One_Class)
Out[38]: True

isinstance

判斷一個對象是否爲一個類的實例

In [42]: isinstance(ins2,Two_Class)
Out[42]: True

hasattr()

判斷一個對象(實例)是否擁有指定的屬性

In [46]: hasattr(ins2,'data_one')
Out[46]: True

In [47]: hasattr(ins2,'data_two')
Out[47]: True


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章