Day15 面向?qū)ο?/h1>

一.內(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()只能在對象方法和類方法中使用

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容