面向對象主要有三個特征:封裝,繼承,多態度。
一.封裝
定義類語
class Animal():
class為定義類的關鍵字,后面跟名字():
python命名規范建議:類一般首字母單詞大寫,屬性變量,函數首單詞字母小寫
定義一個類叫Animal,相關代碼:
class Animal(): ##類里定義的屬性稱為類屬性 count=0 ##構造函數,實例化的時候會自動調用該函數 def __init__(self,name,age,sex): ##構造函數里定義的字段稱為實例屬性 self.name=name self.age=age self.sex=sex print('名字叫:'+self.name+',年齡'+str(self.age)+'歲,性別品種是:'+self.sex) print('當前動物數量:'+str(self.__class__.count)) if __name__ == '__main__': ##實例化Animal a1=Animal('獅子',2,'公')
這里name,age,sex為實例屬性,通過類在實例化的時候賦值,count為類屬性,可通過類名.屬性名的方式賦值
上面代碼運行結果:
這里來改寫下代碼,在構造函數里加上代碼:
self.__class__.count+=1
運行結果:
1.1類屬性和類實例屬性
這里發現類屬性count字段存儲的數據是全局,每次實例化對象的時候值都是在之前基礎上相加,而沒有被銷毀。
類屬性和類實例屬性最大的區別就是:
類屬性字段的值不會因為類的實例化而丟失,是全局保存的
類實例屬性:只有每次實例化類對象賦值的時候才有值,不是全局保存的。
查看解釋器里生成的雷屬性代碼;類名.__dict__
1.2類函數
語法: def detail_info(self):
def 后面跟函數名稱,self為必須函數,這里也可能用別的名稱,但為了命名統一,這里推薦用self
改寫后方法:
實例化對象可直接調用
1.3,私有屬性,函數
在Java和c#里私有,公有都用private,public表示,但在python里沒有這兩個關鍵字,python里在屬性或者函數名加__表示私有,則只能在類的內部訪問,其他地方則無法訪問
將函數detail_info改為私有私有函數
運行結果
發現這里提示找不到__detail_info函數,這里就表示私有函數起作用了
實例方法
定義:第一個參數必須是實例對象,該參數名一般約定為“self”,通過它來傳遞實例的屬性和方法(也可以傳類的屬性和方法);
調用:只能由實例對象調用。
類方法
定義:使用裝飾器@classmethod。第一個參數必須是當前類對象,該參數名一般約定為“cls”,通過它來傳遞類的屬性和方法(不能傳實例的屬性和方法);
調用:實例對象和類對象都可以調用。
靜態方法
定義:使用裝飾器@staticmethod。參數隨意,沒有“self”和“cls”參數,但是方法體中不能使用類或實例的任何屬性和方法;
二。繼承
python里支持單根繼承,多繼承
相關語法
super為關鍵字,調用父類構造函數。