亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python面向?qū)ο缶幊讨庋b的藝術(shù)你了解嗎

 更新時(shí)間:2022年02月28日 10:43:10   作者:代碼輸入中...  
這篇文章主要為大家詳細(xì)介紹了Python面向?qū)ο缶幊讨庋b的藝術(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

1. 面向?qū)ο缶幊?nbsp;

OOP ( Object Oriented Programming) 即面向?qū)ο缶幊獭?/strong>

面向?qū)ο缶幊淌且环N 編碼思想 ,或是一種 代碼組織方式 。如同編輯文章時(shí),可以選擇 分段、分節(jié) 的方式讓文章看起來有層次、更方便閱讀或修改。

編碼時(shí)可以選擇使用 OOP 方案,也可以選擇不使用。如同行文一樣,使用或不使用都不會(huì)對(duì) 核心邏輯 產(chǎn)生影響。

面向?qū)ο缶幊逃凶约旱暮诵木幋a理論,對(duì)于任何一種計(jì)算機(jī)語言而言,如果選擇支持此理論, 則稱此計(jì)算機(jī)語言支持面向?qū)ο缶幊?/strong> 。如 C++、Java、Python……

因每一種計(jì)算機(jī)語言語法上的差異性,在提供 OOP 實(shí)現(xiàn)時(shí)的 語法規(guī)范 會(huì)有很大的區(qū)別。除此之外,對(duì)于每一種語言而言,也可以在 OOP 基礎(chǔ)理論上進(jìn)行語法擴(kuò)展或限制。如 Python 支持多繼承。而 Java 語言只支持單根繼承……

1.1 OOP 特點(diǎn)

要了解 OOP 的特點(diǎn),可從 2 個(gè)角度進(jìn)行闡述。

廣義角度:讓程序像人類解決問題一樣去解決問題,讓程序具有人的思維模式。

人類解決問題時(shí),先是要了解問題域中會(huì)涉及到 哪些對(duì)象 ,然后再深入了解 每一個(gè)對(duì)象的特性或功能, 最后再做出相應(yīng)的決策。

比如:為班級(jí)選一名班長(zhǎng)。

選班長(zhǎng)就是現(xiàn)實(shí)世界的一個(gè)問題域,如何才能選擇一名符合要求的班長(zhǎng)?

1.首先確定此問題中涉及的對(duì)象(此處便是班上的所有學(xué)生)。

2.然后了解每一個(gè)學(xué)生的興趣、愛好、性格……以及個(gè)人能力等等。

3.從了解的群體中匹配一個(gè)符合 班長(zhǎng)標(biāo)準(zhǔn) 的學(xué)生便可。

面向?qū)ο缶幊讨械?nbsp;對(duì)象一詞 ,便是借鑒了現(xiàn)實(shí)世界中對(duì)象概念。

狹義角度:OOP 編碼為整個(gè)程序維護(hù)帶來的優(yōu)勢(shì)

OOP 組織的代碼可讓程序整體上有高度的可閱讀性,除此之外,最主要的特點(diǎn)是可提高代碼的 復(fù)用性、安全性、可擴(kuò)展性。

任何事情都會(huì) 2 面性,OOP 會(huì)增加代碼的理解難度。

1.2 OOP 基本概念

OOP 中有兩個(gè)很重要的概念, 類和對(duì)象 。

對(duì)象從何而來?

現(xiàn)實(shí)世界中我們很少思考這個(gè)問題,在 選班長(zhǎng)時(shí) ,不會(huì)思考學(xué)生是從哪里來的,即使思考這個(gè)問題,也會(huì)認(rèn)為那是哲學(xué)家的事情。

我們不思考現(xiàn)實(shí)世界中的手機(jī)、電腦、電視機(jī)是怎么來的……因?yàn)槲覀儾魂P(guān)心這個(gè),我們關(guān)心的是使用它們所提供的功能。

如果我們思考一下手機(jī)是怎么出現(xiàn)的,則會(huì)發(fā)現(xiàn):

1.首先需要工程師設(shè)計(jì)手機(jī)藍(lán)圖。

2.在工廠里根據(jù)手機(jī)藍(lán)圖進(jìn)行生產(chǎn)(可能生產(chǎn)很多)。

3.用戶購買手機(jī),了解手機(jī)特性和功能,使用手機(jī)。

我們身邊的諸如 電視機(jī)、洗衣機(jī)、電腦……

無不例外的需要經(jīng)過這幾個(gè)過程后方能來到我們的世界。

即使是人也是女媧按自己的樣子創(chuàng)建出來的……

同理,電腦世界里不會(huì)突然冒出手機(jī)、電腦、學(xué)生……如何才能讓電腦出現(xiàn)此類對(duì)象。一樣,先設(shè)計(jì)一個(gè)藍(lán)圖,此藍(lán)圖在電腦世界我們就稱其為 “類” 。

有了 “類” 之后才可以 創(chuàng)建手機(jī)對(duì)象 ,有了對(duì)象后才能在程序代碼中使用設(shè)計(jì)時(shí)為手機(jī)賦予功能完成程序邏輯。

現(xiàn)實(shí)世界設(shè)計(jì)手機(jī)藍(lán)圖時(shí),需要設(shè)計(jì)手機(jī)的外觀,如大小、形狀、體重……需要賦予手機(jī)功能、如打電話、播放音樂、播放視頻、上網(wǎng)……

在計(jì)算機(jī)的編碼世界里,同樣在設(shè)計(jì)類時(shí)需要為 “手機(jī)類” 設(shè)計(jì)外觀和功能。 OPP 中稱外觀為屬性,稱功能為方法。

類是藍(lán)圖,具有抽象性特征

對(duì)象是根據(jù)藍(lán)圖創(chuàng)建出來的個(gè)體,具有具體性、實(shí)用性特征

2. Python 實(shí)現(xiàn) OOP

如需使用 OOP 理念實(shí)現(xiàn)程序邏輯,則需遵循如下流程:

2.1 分析問題

首先需要明確問題: 如編寫一個(gè)程序摸擬小狗的行為。

此問題中的對(duì)象便是小狗,所以程序中需要一只小狗。

按上所述,創(chuàng)建小狗之前需要設(shè)計(jì)“狗類”,因此需要為類的設(shè)計(jì)提供足夠的信息。

分析可得在設(shè)計(jì)類時(shí)需要有小狗屬性:姓名、年齡,小狗的行為:尊下、打滾。

2.2 類設(shè)計(jì)語法

class Dog():
    def __init__(self, name, age):
        """初始化屬性name和age"""
        self.name = name
        self.age = age
    def sit(self):
        """小狗蹲下行為"""
        print(self.name.title() + " 乖乖的尊下了!")
    def roll_over(self):
        """小狗打滾"""
        print(self.name.title() + " 開始打滾哈!")

如上為 python 中類設(shè)計(jì)的結(jié)構(gòu)語法:

  • 類的函數(shù)稱為方法,方法的第一個(gè)參數(shù)須是 self 關(guān)鍵字。
  • __init__ 方法是必須的,其方法名不得修改。 此方法會(huì)在創(chuàng)建對(duì)象時(shí)被自動(dòng)調(diào)用,用來初始化對(duì)象數(shù)據(jù)。
  • self.name 聲明一個(gè)對(duì)象變量,此變量會(huì)保存對(duì)象的數(shù)據(jù)。

2.3 創(chuàng)建對(duì)象語法

有了類后,方可創(chuàng)建對(duì)象,有了對(duì)象后方可激活屬性和方法。

my_dog = Dog('小雪', 6) print("小狗的名字:"+my_dog.name.title()+".") print("小狗今年"+str(my_dog.age)+" 歲了")
my_dog.sit() my_dog.roll_over()

創(chuàng)建小狗時(shí),需調(diào)用和 類名相同的方法 ,如上述的 Dog( ) 方法,此方法也叫 構(gòu)造方法 ,此方法實(shí)質(zhì)是調(diào)用了類設(shè)計(jì)中的 __init__ 方法。所以需要傳遞小狗的具體姓名和年齡初始 name 和 age 變量。

調(diào)用類中的方法時(shí),不需要為方法聲明時(shí)的 self 參數(shù)傳遞值。

有了對(duì)象后,如需要使用此對(duì)象的數(shù)據(jù)時(shí),可使用 . 運(yùn)算符。如上 my_dog.name 得到小狗的姓名。

當(dāng)然,在創(chuàng)建小狗后,也可以根據(jù)需要 修改小狗的姓名和年齡。

my_dog.name='小花'
my_dog.age=4

同樣,也可以使用 . 運(yùn)算符調(diào)用類設(shè)計(jì)時(shí)的方法。調(diào)用方法也不需要為第一個(gè)參數(shù) self 傳值。

運(yùn)行結(jié)果:

小狗的名字:小雪.
小狗今年6 歲了
小雪 乖乖的尊下了!
小雪 開始打滾哈!

有了類之后,可以根據(jù)此類的設(shè)計(jì)方案,創(chuàng)建出多個(gè)對(duì)象。每一個(gè)對(duì)象有自己的數(shù)據(jù)空間,彼此之間的數(shù)據(jù)是獨(dú)立且隔離的。

my_dog = Dog('小黑', 6)
your_dog = Dog('小白', 3)
print("我的小狗的名字: "+my_dog.name.title()+".")
print("我的小狗的年齡 "+str(my_dog.age)+"歲了.")
my_dog.sit()
print("\n你的小狗的名字: "+your_dog.name.title()+".")
print("你的小狗的年齡 "+str(your_dog.age)+" 歲了.")
your_dog.sit()

如同現(xiàn)實(shí)世界一樣?,F(xiàn)在有了 2 只小狗,它們是獨(dú)立的個(gè)體。修改其中一只狗的名字,對(duì)另一只小狗是沒影響的。

我的小狗的名字: 小黑.
我的小狗的年齡 6歲了.
小黑 乖乖的尊下了!
 
你的小狗的名字: 小白.
你的小狗的年齡 3 歲了.
小白 乖乖的尊下了!

3. OOP 的封裝性

封裝性可以從 2 個(gè)角度上展開討論:

3.1 廣義角度:無處不封裝

類就是一個(gè)封裝體:它把 數(shù)據(jù) 以及對(duì) 數(shù)據(jù)的相關(guān)操作 方法封裝在了一起。

方法也是一個(gè)封裝體: 封裝了代碼邏輯 。

封裝的優(yōu)點(diǎn)!

當(dāng)我們通過對(duì)象使用 數(shù)據(jù)和方法 時(shí),不需要了解其中的內(nèi)部細(xì)節(jié),如此實(shí)現(xiàn)了 設(shè)計(jì)和使用 的分離,和現(xiàn)實(shí)世界中我們使用手機(jī)一樣,不需了解手機(jī)的內(nèi)部結(jié)構(gòu)和細(xì)節(jié)。

開發(fā)者在使用 python 提供的模塊時(shí),不需要了解模塊中的相關(guān)實(shí)現(xiàn)細(xì)節(jié),直接使用其功能便可。

設(shè)計(jì)和使用的分離能加速工業(yè)軟件的開發(fā)效率。 

3.2 狹義角度:保證內(nèi)部數(shù)據(jù)的完整性

創(chuàng)建一只小狗后,可以編寫如下代碼修改小狗的年齡。

my_dog = Dog('小雪', 6)
my_dog.age=-4

顯然這是不符合實(shí)際情況的,沒有一只小狗的年齡可以是負(fù) 4 歲。但是,現(xiàn)在程序可以正常運(yùn)行。

小狗今年-4 歲了

出現(xiàn)這樣不合常理的想象,應(yīng)該追究誰的責(zé)任。 類的設(shè)計(jì)者還是對(duì)象使用者?

我們應(yīng)該要追究類設(shè)計(jì)者的責(zé)任,就如同我剛買的手機(jī)不能充電一樣,是設(shè)計(jì)者的設(shè)計(jì)缺陷引起的。

我們應(yīng)該在設(shè)計(jì)類的時(shí)候提供一種內(nèi)部安全檢查機(jī)制,保護(hù) 變量 能被賦予一個(gè)正確的、可靠的值。

實(shí)施流程:

1. 在變量、方法的前面加上雙下劃線(__)讓變量成為私有概念

python 的語法有很大的彈性。添加下劃性只是一種象征性或類似于道德層面的約定。并不能真正意義上讓外部不能訪問。

class Dog():
    def __init__(self, name, age):
        """初始化屬性name和age"""
        self.name = name
        #私有化
        self.__age = age
    def sit(self):
        """小狗蹲下行為"""
        print(self.name.title() + " 乖乖的尊下了!")
    def roll_over(self):
        """小狗打滾"""
        print(self.name.title() + " 開始打滾哈!")

2. 在類中提供對(duì)應(yīng)的 set 和 get 方法實(shí)現(xiàn)對(duì)內(nèi)部變量的保護(hù)。

def get_age(self):
        return self.__age
    # 對(duì)數(shù)據(jù)進(jìn)行檢查
    def set_age(self, age):
        if age<0:
            print("小狗的年齡不可能為負(fù)數(shù)")
            return
        self.__age = age

3. 測(cè)試

my_dog = Dog('小雪', 6)
my_dog.set_age(-4)
print("小狗的名字:"+my_dog.name.title()+".")
print("小狗今年"+str(my_dog.get_age())+" 歲了")

輸出結(jié)果

小狗的年齡不可能為負(fù)數(shù)
小狗的名字:小雪.
小狗今年6 歲了

python 還有一種更優(yōu)雅的解決方案。使用注解方式。

class Dog():
    def __init__(self, name, age):
        self.name = name
        # 私有屬性,屬性名(age)前面雙下劃線的名稱
        self.__age = age
    # 實(shí)例方法
    def run(self):
        print("{} 在跑……".format(self.name))
    # 使用 @property 定義age屬性的 get 方法
    @property
    def age(self):
        return self.__age
    # 使用 @age.setter 定義 age 屬性的 set 方法必須放在@property的后面
    @age.setter
    def age(self, age):
        if age < 0:
            print("小狗的年齡不能是負(fù)數(shù)")
            return
        self.__age = age
#實(shí)例化小狗
dog = Dog("小紅", 3)
print("{0} 狗狗的年齡是 {1}".format(dog.name, dog.age))
#修改年齡
dog.age = -4
print("{0} 狗狗的年齡是 {1}".format(dog.name, dog.age))

輸出結(jié)果

小紅 狗狗的年齡是 3
小狗的年齡不能是負(fù)數(shù)
小紅 狗狗的年齡是 3

4 . 總結(jié)

面向?qū)ο缶幊炭梢杂谩度祟惡?jiǎn)史》中的一句話總結(jié),人類文明的進(jìn)步不一定能澤福到每一個(gè)個(gè)體。

類可以設(shè)計(jì)的很完美,但每一個(gè)對(duì)象作為個(gè)體可以有自己的命運(yùn)。

封裝是面向?qū)ο缶幊汤砟钪凶罨疽彩亲钪匾奶匦裕瑳]有封裝便沒有后續(xù)的更多。

封裝可能讓我們把相關(guān)聯(lián)的數(shù)據(jù)與方法構(gòu)建成一個(gè)邏輯上的整體,也可保護(hù)內(nèi)部數(shù)據(jù)的安全性,畢竟 沒有數(shù)據(jù)安全性的程序是沒有意義的。

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!       

相關(guān)文章

  • 教你利用pygame模塊制作跳躍小球小游戲

    教你利用pygame模塊制作跳躍小球小游戲

    pygame是一個(gè)專門設(shè)計(jì)來進(jìn)行游戲開發(fā)設(shè)計(jì)的Python模塊,因?yàn)閿[脫了被低級(jí)語言(如機(jī)器語言和匯編語言)的束縛,使用起來非常的簡(jiǎn)單,這篇文章主要給大家介紹了關(guān)于如何利用pygame模塊制作跳躍小球小游戲的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • python執(zhí)行g(shù)et提交的方法

    python執(zhí)行g(shù)et提交的方法

    這篇文章主要介紹了python執(zhí)行g(shù)et提交的方法,實(shí)例分析了Python通過get傳遞數(shù)據(jù)的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04
  • Python打印斐波拉契數(shù)列實(shí)例

    Python打印斐波拉契數(shù)列實(shí)例

    這篇文章主要介紹了Python打印斐波拉契數(shù)列的方法,實(shí)例分析了基于Python實(shí)現(xiàn)斐波那契數(shù)列的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • 用Python爬取618當(dāng)天某東熱門商品銷量數(shù)據(jù),看看大家喜歡什么!

    用Python爬取618當(dāng)天某東熱門商品銷量數(shù)據(jù),看看大家喜歡什么!

    618購物節(jié),準(zhǔn)備分析一波購物節(jié)大家都喜歡買什么?本文以某東為例,Python爬取618活動(dòng)的暢銷商品數(shù)據(jù),并進(jìn)行數(shù)據(jù)清洗,最后以可視化的方式從不同角度去了解暢銷商品中,名列前茅的商品是哪些?銷售數(shù)據(jù)如何?用戶好評(píng)如何?等等,需要的朋友可以參考下
    2021-06-06
  • python中用logging實(shí)現(xiàn)日志滾動(dòng)和過期日志刪除功能

    python中用logging實(shí)現(xiàn)日志滾動(dòng)和過期日志刪除功能

    這篇文章主要介紹了python中用logging實(shí)現(xiàn)日志滾動(dòng)和過期日志刪除功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 使用python和pygame繪制繁花曲線的方法

    使用python和pygame繪制繁花曲線的方法

    本篇文章主要介紹了使用python和pygame繪制繁花曲線的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • Python3.7 讀取 mp3 音頻文件生成波形圖效果

    Python3.7 讀取 mp3 音頻文件生成波形圖效果

    這篇文章主要介紹了Python3.7 讀取 mp3 音頻文件生成波形圖小編,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • python數(shù)據(jù)可視化之初探?Seaborn

    python數(shù)據(jù)可視化之初探?Seaborn

    Seaborn?是一個(gè)基于?Matplotlib?的?Python?數(shù)據(jù)可視化庫,它提供了更高級(jí)別的接口,使得創(chuàng)建美觀的統(tǒng)計(jì)圖形變得非常簡(jiǎn)單,在這篇文章中,我們將討論?Seaborn?的基礎(chǔ)使用方法,包括如何創(chuàng)建各種常見的統(tǒng)計(jì)圖形
    2023-07-07
  • Python函數(shù)對(duì)象與閉包介紹

    Python函數(shù)對(duì)象與閉包介紹

    這篇文章主要介紹了Python函數(shù)對(duì)象與閉包,函數(shù)對(duì)象指的是函數(shù)可以被當(dāng)做’數(shù)據(jù)’來處理,具體可以分為四個(gè)方面的使用,下文我們就來看看具體的這四種實(shí)用方法吧,需要的朋友可以參考一下
    2022-04-04
  • Python使用import導(dǎo)入本地腳本及導(dǎo)入模塊的技巧總結(jié)

    Python使用import導(dǎo)入本地腳本及導(dǎo)入模塊的技巧總結(jié)

    這篇文章主要介紹了Python使用import導(dǎo)入本地腳本及導(dǎo)入模塊的技巧,結(jié)合實(shí)例形式總結(jié)分析了Python使用import導(dǎo)入本地腳本及導(dǎo)入模塊的使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-08-08

最新評(píng)論