面向?qū)ο蟆庋b
一、概述
Python面向?qū)ο蟮娜筇匦裕悍庋b、繼承和多態(tài)。
封裝:在類中對(duì)數(shù)據(jù)的賦值、內(nèi)部調(diào)用對(duì)外部用戶是透明的,類就像一個(gè)膠囊或容器,里面包含類的數(shù)據(jù)和方法。
二、封裝
在類中我們封裝什么?屬性、方法和對(duì)象
封裝,顧名思義就是將內(nèi)容封裝到某個(gè)地方,以后再去調(diào)用被封裝在某處的內(nèi)容。所以,在使用面向?qū)ο蟮姆庋b特性時(shí),需要:
·將內(nèi)容封裝到某處
·從某處調(diào)用被封裝的內(nèi)容
第一步:將內(nèi)容封裝到某處
self是一個(gè)形式參數(shù),當(dāng)執(zhí)行obj1 = Foo('wupeiqi', 18 )時(shí),self等于obj1當(dāng)執(zhí)行obj2 =Foo('alex', 78 )時(shí),self等于obj2
所以,內(nèi)容其實(shí)被封裝到了對(duì)象obj1和obj2中,每個(gè)對(duì)象中都有name和age屬性,在內(nèi)存里類似于下圖來保存。
第二步:從某處調(diào)用被封裝的內(nèi)容
調(diào)用被封裝的內(nèi)容時(shí),有兩種情況:
·通過對(duì)象直接調(diào)用
·通過self間接調(diào)用
1、通過對(duì)象直接調(diào)用被封裝的內(nèi)容
#將零散的數(shù)據(jù),包含在一個(gè)類型中#定義一個(gè)商品類型,封裝和商品有關(guān)系的數(shù)據(jù)
2、通過self間接調(diào)用被封裝的內(nèi)容
執(zhí)行類中的方法時(shí),需要通過self間接調(diào)用被封裝的內(nèi)容
將對(duì)象敏感的數(shù)據(jù),封裝在類的內(nèi)部,不讓外界直接訪問;而是通過定義的set/get方法來間接訪問內(nèi)部的數(shù)據(jù)的過程,此時(shí),就可以在set/get方法中,添加條件限制代碼!
>屬性私有化,才能讓外界不能直接訪問
>在p2和p3中,約定了以一個(gè)下劃線開頭的變量,是私有變量,外界不要直接使用
>p3中,要求兩個(gè)下劃線開頭的屬性,表示當(dāng)前類的私有屬性,外界不能訪問
綜上所述,對(duì)于面向?qū)ο蟮姆庋b來說,其實(shí)就是使用構(gòu)造方法將內(nèi)容封裝到對(duì)象中,然后通過對(duì)象直接或者self間接獲取被封裝的內(nèi)容。
三、 類型封裝的步驟
1.抽象一個(gè)類型,完成類的定義
2.使用__slots__魔法屬性,限制當(dāng)前類的屬性列表
3.所有屬性私有化
4.給每個(gè)屬性,提供set/get方法
備注:關(guān)于擴(kuò)展屬性(就是創(chuàng)建好對(duì)象之后增加的屬性),主要是預(yù)留下來,給共享的數(shù)據(jù)使用的
如果對(duì)象中,有需要共享的數(shù)據(jù),可以選擇使用這樣的屬性。
#設(shè)置當(dāng)前類創(chuàng)建的對(duì)象中,可能出現(xiàn)的屬性列表,列表中沒有出現(xiàn)的屬性名稱不允許使用
四、封裝的幾個(gè)階段:
1.類型的定義:零散數(shù)據(jù)包含在一個(gè)類中,封裝
2.屬性私有化,提供set/get函數(shù):封裝進(jìn)階
3.添加@property和@method.setter,隱藏set/get函數(shù):高級(jí)封裝
4.擴(kuò)展:同一個(gè)類中,出現(xiàn)了相同名稱但是參數(shù)不同的函數(shù):方法重載
五、總結(jié)
“封裝”就是將抽象得到的數(shù)據(jù)和行為(或功能)相結(jié)合,形成一個(gè)有機(jī)的整體(即類);封裝的目的是增強(qiáng)安全性和簡化編程,使用者不必了解具體的實(shí)現(xiàn)細(xì)節(jié),而只是要通過外部接口,一特定的訪問權(quán)限來使用類的成員。
簡而言之:封裝就是將內(nèi)容封裝到某個(gè)地方,以后再去調(diào)用被封裝在某處的內(nèi)容。