溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python面向?qū)ο蟮某跫壷R(shí)是什么

發(fā)布時(shí)間:2021-12-04 17:52:21 來源:億速云 閱讀:137 作者:柒染 欄目:互聯(lián)網(wǎng)科技

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ù)式編程

創(chuàng)建類和對象

面向?qū)ο缶幊淌且环N編程方式,此編程方式的落地需要使用 “類” 和 “對象” 來實(shí)現(xiàn),所以,面向?qū)ο缶幊唐鋵?shí)就是對 “類” 和 “對象” 的使用。

  類就是一個(gè)模板,模板里可以包含多個(gè)函數(shù),函數(shù)里實(shí)現(xiàn)一些功能

  對象則是根據(jù)模板創(chuàng)建的實(shí)例,通過實(shí)例對象可以執(zhí)行類中的函數(shù)

Python面向?qū)ο蟮某跫壷R(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ū)ο笕筇匦?/h4>

面向?qū)ο蟮娜筇匦允侵福悍庋b、繼承和多態(tài)。

一、封裝

封裝,顧名思義就是將內(nèi)容封裝到某個(gè)地方,以后再去調(diào)用被封裝在某處的內(nèi)容。

所以,在使用面向?qū)ο蟮姆庋b特性時(shí),需要:

  • 將內(nèi)容封裝到某處

  • 從某處調(diào)用被封裝的內(nèi)容

第一步:將內(nèi)容封裝到某處

Python面向?qū)ο蟮某跫壷R(shí)是什么

 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)存里類似于下圖來保存。

Python面向?qū)ο蟮某跫壷R(shí)是什么

第二步:從某處調(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歲,男,最愛大保健


  • 老張...

Python面向?qū)ο蟮某跫壷R(shí)是什么 函數(shù)式編程

Python面向?qū)ο蟮某跫壷R(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)斗力

Python面向?qū)ο蟮某跫壷R(shí)是什么 游戲人生

二、繼承

繼承,面向?qū)ο笾械睦^承和現(xiàn)實(shí)生活中的繼承相同,即:子可以繼承父的內(nèi)容。

例如:

  貓可以:喵喵叫、吃、喝、拉、撒

  狗可以:汪汪叫、吃、喝、拉、撒

如果我們要分別為貓和狗創(chuàng)建一個(gè)類,那么就需要為 貓 和 狗 實(shí)現(xiàn)他們所有的功能,如下所示:

Python面向?qū)ο蟮某跫壷R(shí)是什么 偽代碼

上述代碼不難看出,吃、喝、拉、撒是貓和狗都具有的功能,而我們卻分別的貓和狗的類中編寫了兩次。如果使用 繼承 的思想,如下實(shí)現(xiàn):

  動(dòng)物:吃、喝、拉、撒

     貓:喵喵叫(貓繼承動(dòng)物的功能)

     狗:汪汪叫(狗繼承動(dòng)物的功能)

Python面向?qū)ο蟮某跫壷R(shí)是什么 偽代碼 

Python面向?qū)ο蟮某跫壷R(shí)是什么 代碼實(shí)例

所以,對于面向?qū)ο蟮睦^承來說,其實(shí)就是將多個(gè)類共有的方法提取到父類中,子類僅需繼承父類而不必一一實(shí)現(xiàn)每個(gè)方法。

注:除了子類和父類的稱謂,你可能看到過 派生類 和 基類 ,他們與子類和父類只是叫法不同而已。

Python面向?qū)ο蟮某跫壷R(shí)是什么

學(xué)習(xí)了繼承的寫法之后,我們用代碼來是上述阿貓阿狗的功能:

Python面向?qū)ο蟮某跫壷R(shí)是什么 代碼實(shí)例

那么問題又來了,多繼承呢?

  • 是否可以繼承多個(gè)類

  • 如果繼承的多個(gè)類每個(gè)類中都定了相同的函數(shù),那么那一個(gè)會(huì)被使用呢?

1、Python的類可以繼承多個(gè)類,Java和C#中則只能繼承一個(gè)類

2、Python的類如果繼承了多個(gè)類,那么其尋找方法的方式有兩種,分別是:深度優(yōu)先廣度優(yōu)先

Python面向?qū)ο蟮某跫壷R(shí)是什么

  • 當(dāng)類是經(jīng)典類時(shí),多繼承情況下,會(huì)按照深度優(yōu)先方式查找

  • 當(dāng)類是新式類時(shí),多繼承情況下,會(huì)按照廣度優(yōu)先方式查找

經(jīng)典類和新式類,從字面上可以看出一個(gè)老一個(gè)新,新的必然包含了跟多的功能,也是之后推薦的寫法,從寫法上區(qū)分的話,如果 當(dāng)前類或者父類繼承了object類,那么該類便是新式類,否則便是經(jīng)典類。

Python面向?qū)ο蟮某跫壷R(shí)是什么 Python面向?qū)ο蟮某跫壷R(shí)是什么

Python面向?qū)ο蟮某跫壷R(shí)是什么 經(jīng)典類多繼承

Python面向?qū)ο蟮某跫壷R(shí)是什么 新式類多繼承

經(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面向?qū)ο蟮某跫壷R(shí)是什么 Python偽代碼實(shí)現(xiàn)Java或C#的多態(tài)

Python面向?qū)ο蟮某跫壷R(shí)是什么 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è)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(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)容。

AI