1.私有化
讓屬性和方法只能在類的內(nèi)部使用,不能在類的外部使用
1)語法:
聲明屬性或者方法的時(shí)候,在屬性名或者方法名前加'__'
2)python私有化的原理
python并不能像java一樣從訪問權(quán)限上去限制屬性和方法,沒有真正的私有屬性和方法。
私有化只是在兩個(gè)下劃線開頭的名字前加前綴'_類名',導(dǎo)致不能直接通過原名進(jìn)行訪問
2.對象屬性的保護(hù)
1.不要直接訪問或者修改對象屬性的值,而是通過屬性訪問器(getter)和修改器(setter)去操作對象屬性
2.需要添加getter或者setter的對象屬性,屬性命名的時(shí)候需要在最前面加''。
(添加''的目的是為了告訴使用者,這個(gè)屬性我給它添加了getter或者setter)
1)getter - 獲取屬性的值(間接)
a.語法:
@property
def 函數(shù)名(self):
其他語句
return 屬性值
通過不帶下劃線去獲取屬性的值的時(shí)候,本質(zhì)是在調(diào)用屬性對應(yīng)的getter方法,結(jié)果是getter的返回值
b.說明:
函數(shù)名 - 對應(yīng)的屬性名去掉下劃線
屬性值 - 和對應(yīng)的有下劃線的屬性值有關(guān)聯(lián)
c.什么時(shí)候用
如果希望在獲取某個(gè)屬性的值之前干點(diǎn)別的事情,就給這個(gè)屬性添加getter
2)setter - 給屬性賦值(間接)
想要添加setter必須先添加getter
a.語法:
@getter名.setter
def 函數(shù)名(self, 參數(shù)):
其他語句
self.屬性 = 值
c.什么時(shí)候用
如果在給屬性賦值之前干點(diǎn)兒別的事情,就給這個(gè)屬性添加setter
3.類中的方法: 對象方法、類方法、靜態(tài)方法
1)對象方法
a.怎么聲明: 直接聲明在類中
b.特點(diǎn): 有默認(rèn)參數(shù)self;調(diào)用的時(shí)候不用傳參,指向當(dāng)前對象
c.怎么調(diào)用: 通過對象來調(diào)用(對象.對象方法())
d.什么時(shí)候使用: 如果實(shí)現(xiàn)函數(shù)的功能,需要使用對象屬性,就用對象方法
2)類方法
a.怎么聲明: 聲明函數(shù)前添加@classmethod裝飾器
b.特點(diǎn): 有默認(rèn)參數(shù)cls; 調(diào)用的時(shí)候不用傳參, 系統(tǒng)將調(diào)用這個(gè)方法的類傳給它,指向當(dāng)前類
c.怎么調(diào)用: 通過類來調(diào)用
d.什么時(shí)候使用: 在不需要對象屬性的前提下,需要類的字段,就使用類方法
(cls:當(dāng)前類,當(dāng)前類能做的事情,cls都能做)
3)靜態(tài)方法
a.怎么聲明:聲明前添加@staticmethod裝飾器
b.特點(diǎn): 沒有默認(rèn)參數(shù)
c.怎么調(diào)用: 通過類來調(diào)用
d.什么時(shí)候使用: 既不需要對象屬性也不需要類的字段,就使用靜態(tài)方法
4.繼承
繼承者 - 子類
被繼承者 - 父類
繼承 - 讓子類直接擁有父類的屬性和方法
1.語法:
class 類名(父類):
類的內(nèi)容
2.在子類中添加內(nèi)容
1)在子類中添加字段和方法
直接在子類中聲明新的字段和方法
2)添加對象屬性
在子類中實(shí)現(xiàn)init方法,并且添加新屬性。同時(shí)需要通過super().init()去調(diào)用父類的init方法
補(bǔ)充: 類中的函數(shù)的調(diào)用過程
先看當(dāng)前類中是否有這個(gè)方法,如果有直接調(diào)用自己的方法;沒有就去看父類有沒有這個(gè)方法,如果有就調(diào)用父類的方法;
如果父類也沒有就找父類的父類,以此類推, 如果直到找到object都沒有找到這個(gè)方法,才報(bào)錯(cuò)!
python中所有的類默認(rèn)都是繼承object, object是python中所有類的基類
3.重寫
在子類中重新實(shí)現(xiàn)父類的函數(shù); 可以通過super()去調(diào)用父類中的方法。
注意: super()不能在靜態(tài)方法中使用,只能在對象方法和類方法中用