您好,登錄后才能下訂單哦!
Python面向?qū)ο蟮某跫壷R(shí)是什么,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
面向過程:根據(jù)業(yè)務(wù)邏輯從上到下寫壘代碼
函數(shù)式:將某功能代碼封裝到函數(shù)中,日后便無需重復(fù)編寫,僅調(diào)用函數(shù)即可
面向?qū)ο螅簩瘮?shù)進(jìn)行分類和封裝,讓開發(fā)“更快更好更強(qiáng)...”
面向過程編程最易被初學(xué)者接受,其往往用一長段代碼來實(shí)現(xiàn)指定功能,開發(fā)過程中最常見的操作就是粘貼復(fù)制,即:將之前實(shí)現(xiàn)的代碼塊復(fù)制到現(xiàn)需功能處。
def 發(fā)送郵件(內(nèi)容)
#發(fā)送郵件提醒
連接郵箱服務(wù)器
發(fā)送郵件
關(guān)閉連接
while True:
if cpu利用率 > 90%:
發(fā)送郵件('CPU報(bào)警')
if 硬盤使用空間 > 90%:
發(fā)送郵件('硬盤報(bào)警')
if 內(nèi)存占用 > 80%:
發(fā)送郵件('內(nèi)存報(bào)警')
今天我們來學(xué)習(xí)一種新的編程方式:面向?qū)ο缶幊蹋∣bject Oriented Programming,OOP,面向?qū)ο蟪绦蛟O(shè)計(jì))
注:Java和C#來說只支持面向?qū)ο缶幊?,而python比較靈活即支持面向?qū)ο缶幊桃仓С趾瘮?shù)式編程
面向?qū)ο缶幊淌且环N編程方式,此編程方式的落地需要使用 “類” 和 “對象” 來實(shí)現(xiàn),所以,面向?qū)ο缶幊唐鋵?shí)就是對 “類” 和 “對象” 的使用。
類就是一個(gè)模板,模板里可以包含多個(gè)函數(shù),函數(shù)里實(shí)現(xiàn)一些功能
對象則是根據(jù)模板創(chuàng)建的實(shí)例,通過實(shí)例對象可以執(zhí)行類中的函數(shù)
class是關(guān)鍵字,表示類
創(chuàng)建對象,類名稱后加括號即可
ps:類中的函數(shù)第一個(gè)參數(shù)必須是self(詳細(xì)見:類的三大特性之封裝)
類中定義的函數(shù)叫做 “方法”
<td class="code" min-height:auto !important;">
# 創(chuàng)建類
class Foo:
def Bar(self):
print 'Bar'
def Hello(self, name):
print 'i am %s' %name
# 根據(jù)類Foo創(chuàng)建對象obj
obj = Foo()
obj.Bar() #執(zhí)行Bar方法
obj.Hello('wupeiqi') #執(zhí)行Hello方法
誒,你在這里是不是有疑問了?使用函數(shù)式編程和面向?qū)ο缶幊谭绞絹韴?zhí)行一個(gè)“方法”時(shí)函數(shù)要比面向?qū)ο蠛啽?/em>
面向?qū)ο螅骸緞?chuàng)建對象】【通過對象執(zhí)行方法】
函數(shù)編程:【執(zhí)行函數(shù)】
觀察上述對比答案則是肯定的,然后并非絕對,場景的不同適合其的編程方式也不同。
總結(jié):函數(shù)式的應(yīng)用場景 --> 各個(gè)函數(shù)之間是獨(dú)立且無共用的數(shù)據(jù)
面向?qū)ο蟮娜筇匦允侵福悍庋b、繼承和多態(tài)。
一、封裝
封裝,顧名思義就是將內(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í)被封裝到了對象 obj1 和 obj2 中,每個(gè)對象中都有 name 和 age 屬性,在內(nèi)存里類似于下圖來保存。
第二步:從某處調(diào)用被封裝的內(nèi)容
調(diào)用被封裝的內(nèi)容時(shí),有兩種情況:
通過對象直接調(diào)用
通過self間接調(diào)用
1、通過對象直接調(diào)用被封裝的內(nèi)容
上圖展示了對象 obj1 和 obj2 在內(nèi)存中保存的方式,根據(jù)保存格式可以如此調(diào)用被封裝的內(nèi)容:對象.屬性名
+ View Code
2、通過self間接調(diào)用被封裝的內(nèi)容
執(zhí)行類中的方法時(shí),需要通過self間接調(diào)用被封裝的內(nèi)容
+ View Code
綜上所述,對于面向?qū)ο蟮姆庋b來說,其實(shí)就是使用構(gòu)造方法將內(nèi)容封裝到 對象 中,然后通過對象直接或者self間接獲取被封裝的內(nèi)容。
練習(xí)一:在終端輸出如下信息
小明,10歲,男,上山去砍柴
小明,10歲,男,開車去東北
小明,10歲,男,最愛大保健
老李,90歲,男,上山去砍柴
老李,90歲,男,開車去東北
老李,90歲,男,最愛大保健
老張...
函數(shù)式編程
面向?qū)ο?/p>
上述對比可以看出,如果使用函數(shù)式編程,需要在每次執(zhí)行函數(shù)時(shí)傳入相同的參數(shù),如果參數(shù)多的話,又需要粘貼復(fù)制了... ;而對于面向?qū)ο笾恍枰趧?chuàng)建對象時(shí),將所有需要的參數(shù)封裝到當(dāng)前對象中,之后再次使用時(shí),通過self間接去當(dāng)前對象中取值即可。
練習(xí)二:游戲人生程序
1、創(chuàng)建三個(gè)游戲人物,分別是:
蒼井井,女,18,初始戰(zhàn)斗力1000
東尼木木,男,20,初始戰(zhàn)斗力1800
波多多,女,19,初始戰(zhàn)斗力2500
2、游戲場景,分別:
草叢戰(zhàn)斗,消耗200戰(zhàn)斗力
自我修煉,增長100戰(zhàn)斗力
多人游戲,消耗500戰(zhàn)斗力
游戲人生
二、繼承
繼承,面向?qū)ο笾械睦^承和現(xiàn)實(shí)生活中的繼承相同,即:子可以繼承父的內(nèi)容。
例如:
貓可以:喵喵叫、吃、喝、拉、撒
狗可以:汪汪叫、吃、喝、拉、撒
如果我們要分別為貓和狗創(chuàng)建一個(gè)類,那么就需要為 貓 和 狗 實(shí)現(xiàn)他們所有的功能,如下所示:
偽代碼
上述代碼不難看出,吃、喝、拉、撒是貓和狗都具有的功能,而我們卻分別的貓和狗的類中編寫了兩次。如果使用 繼承 的思想,如下實(shí)現(xiàn):
動(dòng)物:吃、喝、拉、撒
貓:喵喵叫(貓繼承動(dòng)物的功能)
狗:汪汪叫(狗繼承動(dòng)物的功能)
偽代碼
代碼實(shí)例
所以,對于面向?qū)ο蟮睦^承來說,其實(shí)就是將多個(gè)類共有的方法提取到父類中,子類僅需繼承父類而不必一一實(shí)現(xiàn)每個(gè)方法。
注:除了子類和父類的稱謂,你可能看到過 派生類 和 基類 ,他們與子類和父類只是叫法不同而已。
學(xué)習(xí)了繼承的寫法之后,我們用代碼來是上述阿貓阿狗的功能:
代碼實(shí)例
那么問題又來了,多繼承呢?
是否可以繼承多個(gè)類
如果繼承的多個(gè)類每個(gè)類中都定了相同的函數(shù),那么那一個(gè)會(huì)被使用呢?
1、Python的類可以繼承多個(gè)類,Java和C#中則只能繼承一個(gè)類
2、Python的類如果繼承了多個(gè)類,那么其尋找方法的方式有兩種,分別是:深度優(yōu)先和廣度優(yōu)先
當(dāng)類是經(jīng)典類時(shí),多繼承情況下,會(huì)按照深度優(yōu)先方式查找
當(dāng)類是新式類時(shí),多繼承情況下,會(huì)按照廣度優(yōu)先方式查找
經(jīng)典類和新式類,從字面上可以看出一個(gè)老一個(gè)新,新的必然包含了跟多的功能,也是之后推薦的寫法,從寫法上區(qū)分的話,如果 當(dāng)前類或者父類繼承了object類,那么該類便是新式類,否則便是經(jīng)典類。
經(jīng)典類多繼承
新式類多繼承
經(jīng)典類:首先去A類中查找,如果A類中沒有,則繼續(xù)去B類中找,如果B類中么有,則繼續(xù)去D類中找,如果D類中么有,則繼續(xù)去C類中找,如果還是未找到,則報(bào)錯(cuò)
新式類:首先去A類中查找,如果A類中沒有,則繼續(xù)去B類中找,如果B類中么有,則繼續(xù)去C類中找,如果C類中么有,則繼續(xù)去D類中找,如果還是未找到,則報(bào)錯(cuò)
注意:在上述查找過程中,一旦找到,則尋找過程立即中斷,便不會(huì)再繼續(xù)找了
三、多態(tài)
Pyhon不支持Java和C#這一類強(qiáng)類型語言中多態(tài)的寫法,但是原生多態(tài),其Python崇尚“鴨子類型”。
Python偽代碼實(shí)現(xiàn)Java或C#的多態(tài)
Python “鴨子類型”
以上就是對于面向?qū)ο蟪跫壷R(shí)的介紹,總結(jié)如下:
面向?qū)ο笫且环N編程方式,此編程方式的實(shí)現(xiàn)是基于對 類 和 對象 的使用
類 是一個(gè)模板,模板中包裝了多個(gè)“函數(shù)”供使用
對象,根據(jù)模板創(chuàng)建的實(shí)例(即:對象),實(shí)例用于調(diào)用被包裝在類中的函數(shù)
面向?qū)ο笕筇匦裕悍庋b、繼承和多態(tài)
看完上述內(nèi)容,你們掌握Python面向?qū)ο蟮某跫壷R(shí)是什么的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。