標籤:python class 物件導向 類
Class(類)的基本概念:
類:將同一種具體事務的共同點抽象出來的表現,Python的類是一種可調用對象。
類中定義的有方法,變數,資料結構。
變數則是類屬性本身是沒有資料的,只有在執行個體化的時候將資料引入。
方法就是函數;是操作變數引用的資料的代碼,可以知道方法是操作資料的,由於類中不包含資料,所以類無法調用方法,只有執行個體化引入資料成為執行個體(也稱為對象)才可以調用方法。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/70/68/wKioL1W3YdqgRLUdAAJpUMeMzr4546.jpg" title="2--2.jpg" alt="wKioL1W3YdqgRLUdAAJpUMeMzr4546.jpg" />
對象的由來:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/70/6B/wKiom1W3U_6wTo4rAABqBLMXMjw257.jpg" title="QQ20150727202931.png" alt="wKiom1W3U_6wTo4rAABqBLMXMjw257.jpg" />
對象(也稱為執行個體)本身是沒有方法的,對象引用的方法是在類中定義的也叫類函數,或者叫介面。
同屬一類執行個體化的對象,具有相同的功能。
類的執行情境:
當定義一個類時,類中的代碼是不會執行的,只有在執行個體化時才會執行。 執行個體化過程中,類的方法不會執行,只有當執行個體調用方法的時候才會執行。
類對象是可調用對象,執行個體對象則是可以調用其中的方法。
類間關係:
依賴:一個類的方法操作另一個類的對象,如果另外一個類的對象沒有被執行個體化出來,這個類就無法執行。
彙總:類A的對象包含類B的對象
繼承:描述特殊與一般關係
物件導向的模型機制的3個原則:
封裝(package)
隱藏實現方案細節,將代碼及其處理的資料繫結在一起的一種編程機制,用於保證程式和資料不受外部幹擾且不會被誤用。
繼承(Inheritance)
通過繼承,子類對象可以獲得父類對象的屬性,一個深度繼承的子類繼承了類層次中它的每個祖先的所有屬性。 (超類、父類、基類)都是同一個概念
在子類中調用一個屬性的時候,如果在本類中沒有,就會一直向上找父類。
多態性(Polymorphism)
允許一個介面被多個通用的類動作使用的特性,具體使用哪個動作與應用場合相關,相當於一個介面多個方法。
概念理解:對於某一個類而言,當傳遞給它的是不同的資料,卻能完成多鐘不同的運算。為了實現同一個目的,而定義同一個介面,背後卻有多種不同的實現。 能夠自動判斷調用哪種實現的這種機制就叫做多態。
作用:降低程式的複雜性
開始一個類程式:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/70/6B/wKiom1W3Y2jD-xxbAAKhg-tD9cw397.jpg" title="3.png" alt="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__建立構造器直接為執行個體提供。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/70/6B/wKiom1W3Zi7gup3FAAFxzwTS0TE865.jpg" title="4.png" alt="wKiom1W3Zi7gup3FAAFxzwTS0TE865.jpg" />
Python 建構函式(別名:構造方法、構造器)
在Python中每一個類都有一個構造器方法__init__,構造方法會在執行個體化時從類名接受一個參數傳給類方法,這樣就可以直接在類初始化時給方法傳參。
構造器在構造執行個體時傳參,直接構造執行個體屬性。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/70/6C/wKiom1W3Z3LDXBLoAAH_OJbmS8M620.jpg" title="5.png" alt="wKiom1W3Z3LDXBLoAAH_OJbmS8M620.jpg" />
構造器是建立執行個體屬性最便捷的方式
__varname__ : 這類方法在某種情境下,Python解譯器會自動調用它們。
當執行 a + b 程式會自動調用 a.__add__(b)
當執行 l2 = [1,2,3] 程式會自動調用 list.__init__()
析構:用於銷毀一個執行個體,解譯器會自動記憶體回收,所以一般很少用解構函式。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/70/6C/wKiom1W3atGgKcSUAAG9uXk1iN4070.jpg" title="析構.png" alt="wKiom1W3atGgKcSUAAG9uXk1iN4070.jpg" />
擷取類中的所有可用屬性和可用方法,可以使用__dict__類的字典屬性,或者內建函數dir。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/70/69/wKioL1W3bVqCwhcgAAEtQ3Xk-6g291.jpg" title="類字典.png" alt="wKioL1W3bVqCwhcgAAEtQ3Xk-6g291.jpg" />
-------------------------------------------------------------------------------------------
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/70/6C/wKiom1W3a6LCbGTZAAFV59FFboM654.jpg" title="類字典2.png" alt="wKiom1W3a6LCbGTZAAFV59FFboM654.jpg" />
擷取執行個體屬性和方法
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/70/69/wKioL1W3bcqyNI1bAAC60lyO2j8947.jpg" title="執行個體屬性.png" alt="wKioL1W3bcqyNI1bAAC60lyO2j8947.jpg" />
方法的可用變數
執行個體變數:指定變數名稱及執行個體自身進行引用 self.變數名
局部變數:方法內部建立的變數,可直接使用
類變數(也稱靜態變數):通過指定變數名與類名進行引用
全域變數:直接使用
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/70/6C/wKiom1W3bULjGrzpAAGJqFY4zNo726.jpg" title="123.png" alt="wKiom1W3bULjGrzpAAGJqFY4zNo726.jpg" />
類的繼承
繼承描述了基類的屬性如何"遺傳"給子類,子類可以繼承它的基類的任何屬性,包括資料屬性和方法,一個未指定基類的類,其預設有一個名為Object的基類,Python允許多重繼承能並行繼承多個父類。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/70/6C/wKiom1W3blPw486IAAD0XjdhrQM687.jpg" title="繼承.png" alt="wKiom1W3blPw486IAAD0XjdhrQM687.jpg" />
實現子類繼承構造方法
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/70/69/wKioL1W3cJ-SDbimAALkSkEpCk4571.jpg" title="繼承構造方法.png" alt="wKioL1W3cJ-SDbimAALkSkEpCk4571.jpg" />
Python中幾乎所有屬性的擷取都可以使用 "object.attribute",的格式。
此運算式會在Python中啟動搜尋—— ——搜尋連續的樹
Class 語句會產生一個類對象,對Class的調用會建立執行個體,執行個體會自動連接至建立了此執行個體的類。
類串連至其超類的方式
繼承就是由下至上,由左至右搜尋此樹來尋找屬性名稱所出現的最低的位置。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/70/6C/wKiom1W3b4vgJ5rfAABJjv6pAgQ952.jpg" title="執行個體與類的尋找關係.png" alt="wKiom1W3b4vgJ5rfAABJjv6pAgQ952.jpg" />
繼承方法的專用化
繼承會先在子類尋找變數名,然後才尋找超類,因此,子類可以對超類的屬性覆蓋來取代繼承而來的方法。也可以通過已覆蓋的方法回調超類來擴充超類的方法
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/70/6C/wKiom1W3cGLQl77PAAHsWCF0uyE785.jpg" title="繼承會先在子類尋找變數名.png" alt="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]: TrueIn [47]: hasattr(ins2,‘data_two‘)Out[47]: True
本文出自 “突破舒適區” 部落格,轉載請與作者聯絡!
Python的物件導向、Class 概念與使用