面向對象特色
- 注重對象與職責,不一樣對象,不一樣職責;
- 應對複雜項目開發,提供固定模版;
- 基於面向過程;
- 封裝:根據功能將屬性和方法封裝到一個抽象的類中;
- 繼承:實現代碼複用,相同代碼不需屢次編寫;
- 多態:不一樣對象調用相同方法得出不一樣結果,增長了代碼的靈活度;
對象
類建立出來的一個具體存在,可直接使用,擁有類所具備的屬性與方法;python
類與對象的關係
- 類是模版,對象根據類建立而出,先有類再有對象;
- 類只有一個,但對象能夠有多個;
- 類中定義屬性與方法,對象中只能具備所建立而出的類所具備的屬性與方法;
類的設計三要素
- 類名:通常知足大駝峯命名法;
- 屬性:一類事物所具備的特徵;
- 方法:一類事物所具備的行爲;
添加類的屬性
- 在建立類以後,對象能夠在外部直接使用
.屬性名
給對象增長屬性,可是這種方式不推薦使用,由於它並無將屬性封裝到類的內部中,只是對象臨時的屬性;
- 在初始化方法內部定義屬性以後,在使用該類建立新對象時,所建立的新對象都會擁有該屬性,使用方法:
self.屬性名 = 屬性初始值
;
對象及內置方法生命週期
方法 |
功能 |
__init_ |
初始化對象並設置屬性 |
__del_ |
銷燬對象 |
__str_ |
必須返回一個字符串,定製變量的輸出信息 |
- 對象從調用
類名()
建立時生命週期即開始;
- 對象生命週期內,既能夠訪問對象屬性,也能夠調用對象方法;
- 對象的
__del__
方法一旦調用,對象的生命週期即結束;
身份運算符
- 功能:用於比較兩個對象內存地址是否一致--即判斷是不是對同一對象的引用;
is
和==
的區別
is
用於判斷兩個變量引用對象是否爲同一個;
==
用於判斷引用變量的值是否相等;
私有屬性與方法
- 定義方式:屬性名或方法名以前增長兩個下劃線,則定義的屬性或方法就是私有屬性或方法;
- 特色:在對象方法外部是不能直接訪問的,只有在方法內部纔可以訪問;
- 子類對象不能直接訪問父類私有屬性或私有方法,但能夠經過父類的公有方法間接訪問私有屬性或私有方法;
僞私有屬性與方法
- 對於定義的私有屬性與方法,經過
_類名__名稱
的方式便可訪問,因此說私有屬性或方法並不是真正意義的私有,而是內部經過特殊處理假裝起來使得外界沒法訪問的。雖然私有屬性或方法咱們均可以訪問,但平常開發中最好不要使用這種方式來訪問私有屬性或方法;
注意
- 內置函數
__str__
必須返回一個字符串;
- 對象的方法內部,能夠直接訪問對象屬性;
- 對於多個對象之間,各自的屬性是互不干擾的;
繼承
class A(B):
pass
- 子類繼承於父類,擁有父類所封裝的屬性與方法,無需二次開發;
- 子類只須要封裝屬於本身特有的,有別於父類的屬性與方法便可;
- 特性:傳遞性;
- 方法重寫:
- 覆蓋基類方法;
- 對基類方法進行拓展,須要使用
super().父類方法
來調用父類方法的執行,而後在方法中其餘位置進行對子類方法的擴展;
多繼承
class 子類名(父類名1, 父類名2,...):
pass
- 注意事項
- 父類名應該避免重複;
- 不一樣父類中的屬性或方法應該避免同名;
新式類與經典類
class A(object):
pass
class A:
pass
實例化
- 每一個對象實例化是都有本身獨立的內存空間,用於保存各自不一樣的屬性;
- 而多個對象的方法在內存中只有一份,在調用方法時須要吧對象的引用傳遞到方法內部;
類方法
@classmethod
def 類方法名(cls):
pass
- 在類方法內部
- 經過
cls.
訪問類的屬性;
- 經過
cls.
調用其餘類方法;
靜態方法
- 須要封裝爲靜態方法的狀況:
- 無需訪問實例屬性或實例方法;
- 無需訪問類屬性或類方法;
- 語法
@staticmethod
def 靜態方法名():
pass
實例方法、類方法、靜態方法之間的區別
- 實例方法:方法內部須要訪問實例屬性,實例方法內部需使用
類名.
訪問類屬性;
- 類方法:方法內部只須要訪問
類屬性
;
- 靜態方法:方法內部不需訪問
實例屬性
與類屬性
;