一.內(nèi)置類對象
1.什么是內(nèi)置類屬性
聲明類的時候系統(tǒng)自動添加的屬性(可能是字段也可能是對象屬性)
定制當(dāng)前類的對象的打印
1) 重新str方法, 這個方法的返回值就是對應(yīng)的打印結(jié)果(類型必須是字符串)
def __str__(self):
# return '{} {} {}'.format(self.name, self.sex, self.age)
return '<' + str(self.__dict__)[1: -1] + '>'
2)重寫repr方法, 這個方法的返回值就是對應(yīng)的打印結(jié)果(類型必須是字符串)
def __repr__(self):
return '<' + str(self.__dict__)[1: -1] + '>' + '(id: %s)' % hex(id(self))
1.name
類的字段: 類.__name__ - 獲取類的名字(字符串)
2.doc
類的字段: 類.__doc__ - 獲取類的說明文檔
3.class
對象屬性: 對象.__class__ - 獲取當(dāng)前對象對應(yīng)的類(和type(對象)功能一樣), 返回的是類
4.dict (將對象轉(zhuǎn)換成字典)
對象屬性: 對象.__dict__ - 將對象中所有的屬性和對應(yīng)的值轉(zhuǎn)換成一個字典中的鍵值對(一個對象對應(yīng)一個字典)
類的字段: 類.__dict__ - 將類轉(zhuǎn)換成一個字典, 字典中的元素是類中所有的字段和對應(yīng)的值
注意: 如果設(shè)置了__slots__的值, 那么當(dāng)前類的對象就不能使用__dict__屬性
5.module
類的字段: 類.__module__ - 獲取當(dāng)前類是在哪個模塊中聲明的(返回的是模塊的名字)
6.bases
類的字段: 類.__bases__ - 獲取當(dāng)前類的父類(返回的是一個元組)
二.私有化
1.訪問權(quán)限: 公開, 保護, 私有
公開 - 公開的屬性和方法在類的內(nèi)部, 外部能夠使用, 也能被繼承
保護 - 保護的屬性和方法在類的內(nèi)部能夠使用, 外部不能使用, 可以被繼承
私有 - 私有的屬性和方法只能在類的內(nèi)部使用, 外部不能使用, 也不能被繼承
2.python中屬性和方法的訪問權(quán)限
python類中所有的屬性和方法本質(zhì)都是公開的; 私有化是假的私有化, 只是提示程序員這個屬性或者方法在外部不要使用, 也不要去繼承
怎么私有化: 在需要私有化的屬性名或者方法名前加''(注意: 不能以''結(jié)尾!)
python私有化的原理: 在私有的屬性和方法前加了'_類名'
三.屬性的getter和setter
1.什么是getter和setter
當(dāng)我們需要在獲取屬性值之前做點別的事情就需要給這個屬性添加getter; 當(dāng)需要給屬性賦值之前做別的事情就需要給這個屬性添加setter
2.給屬性添加setter
1) 屬性命名的時候前面加'_'
2) 在@property裝飾器的后面聲明一個對象方法:
a.將屬性去掉下劃線作為方法名
b.方法除了self以外不需要其他參數(shù)
c.函數(shù)的返回值就是獲取這個屬性的時候得到的值
3) 在外部使用屬性的時候嗎, 通過'對象.不帶下劃線的屬性'使用
注意: 獲取屬性值的時候, 就會自動取調(diào)用getter對應(yīng)的函數(shù)
3.給屬性添加setter
屬性添加setter之前必須先添加getter
1) 保護屬性名前有'_'
2)在@getter名.setter后面聲明對象方法:
a.將屬性去掉下劃線作為方法名
b.需要一個self以外的參數(shù)
c.不需要返回值
3)在外部使用屬性的時候, 通過'對象.不帶下劃線的屬性'去使用
注意: 當(dāng)給屬性賦值的時候, 實質(zhì)是調(diào)用setter對應(yīng)的方法
四.類方法和靜態(tài)方法
1.類中的方法(函數(shù))
類中的方法分為: 對象方法, 類方法和靜態(tài)方法
1)對象方法
a.怎么聲明: 直接聲明
b.怎么調(diào)用: 用對象來調(diào)用
c.特點: 有指向當(dāng)前對象的self
d.什么時候用: 如果實現(xiàn)函數(shù)的功能需要用到對象屬性, 就是用對象方法
2)類方法
a.怎么聲明: 聲明在@classmethod后面
b.怎么調(diào)用: 用類來調(diào)用, '類.類方法()'
c.特點: 有自帶的參數(shù)cls, 表示當(dāng)前類; 這個參數(shù)在調(diào)用的時候不用傳參, 系統(tǒng)會自動將當(dāng)前類傳給他; cls誰調(diào)用就指向誰(如果是對象指向的是對象對應(yīng)的類)
d.什么時候用: 如果實現(xiàn)函數(shù)的功能不需要對象屬性, 但是需要類的字段, 就使用類方法
3)靜態(tài)方法
a.怎么聲明: 聲明在@staticmethod后面
b.怎么調(diào)用: 通過類來調(diào)用, '類.靜態(tài)方法()'
c.特點: 沒有默認(rèn)參數(shù)
d.什么時候用: 實現(xiàn)函數(shù)的功能既不需要類也不需要對象屬性, 就使用靜態(tài)方法
五.繼承
1.什么是繼承
繼承就是讓子類直接擁有父類的屬性和方法
子類 - 繼承者
父類/超類 - 被繼承者
2.怎么繼承
1)語法:
class 類名(父類1, 父類2,...)
說明文檔
類的內(nèi)容
2)說明
() - 固定寫法, 如果省略相當(dāng)于(object) 聲明類的時候如果沒有寫父類, 默認(rèn)繼承object(object又叫基類)
父類 - 一個類的父類可以有多個, 但是一般情況下只有一個(支持多繼承)
在子類中添加對象屬性, 需要先通過super()調(diào)用父類的init來繼承父類的對象屬性
注意: super()只能在對象方法和類方法中使用