Python學(xué)習(xí)筆記-Day08

Python學(xué)習(xí)筆記

Day_08-面向?qū)ο?/h2>

截止目前函匕,我學(xué)習(xí)的編程都是面向過(guò)程的。從今天開(kāi)始,我將學(xué)習(xí)一種全新思維的編程范式,面向?qū)ο螅∣bjected-Oriented)勺鸦。

Python不只是一門支持面向?qū)ο蟮木幊陶Z(yǔ)言,而且還是在多范式的外表下目木,用對(duì)象來(lái)構(gòu)建它的大框架换途。

面向?qū)ο蟛攀荘ython深層次的魅力。

8.1 面向?qū)ο笳Z(yǔ)言的來(lái)歷

面向過(guò)程中刽射,我們?yōu)榱藢?shí)現(xiàn)一個(gè)目標(biāo)军拟,會(huì)編寫一系列代碼。有時(shí)候代碼就會(huì)變得冗長(zhǎng)柄冲、復(fù)雜吻谋,我們用函數(shù)和模塊來(lái)提高程序的可復(fù)用性忠蝗,需要的時(shí)候調(diào)用即可现横。函數(shù)復(fù)雜了,還可以將函數(shù)切割成子函數(shù)來(lái)降低復(fù)雜性阁最,但是戒祠,無(wú)論怎么調(diào)整,其實(shí)我們都是在按照計(jì)算機(jī)的思維來(lái)編寫程序速种。

計(jì)算機(jī)的思維和人的思維是不一樣的姜盈,那么能不能用人的思維來(lái)編寫程序讓計(jì)算機(jī)來(lái)識(shí)別執(zhí)行呢?

面向?qū)ο缶幊套钤缈梢宰匪莸絊imula語(yǔ)言配阵。

克里斯登·奈加特被挪威國(guó)防部征召入伍馏颂,服務(wù)于挪威防務(wù)科學(xué)研究所。他一直在用電腦來(lái)解決國(guó)防中的計(jì)算問(wèn)題棋傍,例如核反應(yīng)堆建設(shè)救拉、艦隊(duì)補(bǔ)給、后勤供應(yīng)等瘫拣。

在解決這些問(wèn)題的過(guò)程中亿絮,奈加特需要用電腦來(lái)模擬出真實(shí)世界的狀況。比如在一次核泄漏事故中會(huì)發(fā)生什么麸拄。奈加特發(fā)現(xiàn),用之前過(guò)程式、指令式的編程方式耘柱,他很難用程序來(lái)表示真實(shí)世界中的個(gè)體猎物。就拿一艘船來(lái)說(shuō),我們會(huì)知道它會(huì)有一些數(shù)據(jù)淮椰,如高度五慈、寬度帮毁、馬力、吃水量等豺撑。它還會(huì)有一些動(dòng)作烈疚,如移動(dòng)、加速聪轿、停泊等爷肝。這艘船就是一個(gè)個(gè)體。有些個(gè)體可以化為一類陆错,如戰(zhàn)列艦和航母都是軍艦灯抛,有些個(gè)體之間有著包含關(guān)系,如一條船有船錨音瓷。

當(dāng)人們講故事的時(shí)候會(huì)自然而然描述來(lái)自真實(shí)世界的個(gè)體对嚼。而計(jì)算機(jī)只會(huì)機(jī)械地執(zhí)行一條條指令。奈加特希望绳慎,當(dāng)他想用計(jì)算機(jī)做模擬時(shí)纵竖,能像講故事一樣方便。就這樣杏愤,奈加特和奧利約翰達(dá)爾一同發(fā)明了一門新語(yǔ)言-Simula靡砌。

我們可以把面向?qū)ο罂醋魇枪适潞椭噶钪g的橋梁。程序員用一種故事式的編程語(yǔ)言描述問(wèn)題珊楼,隨后編譯器會(huì)把這些程序翻譯成機(jī)器指令通殃。在早期,這些額外的翻譯工作會(huì)消耗太多的計(jì)算機(jī)資源厕宗,所以一開(kāi)始面向?qū)ο缶幊滩⒉涣餍小?/p>

隨著計(jì)算機(jī)性能的提高画舌,人們慢慢開(kāi)始發(fā)掘面向?qū)ο缶幊陶Z(yǔ)言的潛力。最先取得成功的是C++語(yǔ)言已慢,后來(lái)的Java語(yǔ)言向著更純粹的面向?qū)ο蠓妒娇繑n曲聂,很快取得了商業(yè)上的成功。

Python也是一門面向?qū)ο笳Z(yǔ)言蛇受。只有了解Python的對(duì)象句葵,我們才能看到這門語(yǔ)言的全貌。

按照面向?qū)ο缶幊汤砟罹ぱ觯绦蛑械臄?shù)據(jù)和操作數(shù)據(jù)的函數(shù)是一個(gè)邏輯上的整體乍丈,我們稱之為“對(duì)象”,而我們解決問(wèn)題的方式就是創(chuàng)建出需要的對(duì)象并向?qū)ο蟀l(fā)出各種各樣的消息把将,多個(gè)對(duì)象的協(xié)同工作最終可以讓我們構(gòu)造出復(fù)雜的系統(tǒng)來(lái)解決現(xiàn)實(shí)中的問(wèn)題轻专。

8.2 類和對(duì)象

類(class):用來(lái)描述具有相同屬性和方法的對(duì)象的集合。定義了該集合中每個(gè)對(duì)象所共有的屬性和方法察蹲。對(duì)象是類的實(shí)例请垛。

對(duì)象:通過(guò)類定義的數(shù)據(jù)結(jié)構(gòu)實(shí)例催训。

簡(jiǎn)單的說(shuō),類是對(duì)象的藍(lán)圖和模板宗收,而對(duì)象是類的實(shí)例漫拭。這個(gè)解釋雖然有點(diǎn)像用概念在解釋概念,但是從這句話我們至少可以看出混稽,類是抽象的概念采驻,而對(duì)象是具體的東西。在面向?qū)ο缶幊痰氖澜缰行傺磺薪詾閷?duì)象礼旅,對(duì)象都有屬性和行為,每個(gè)對(duì)象都是獨(dú)一無(wú)二的洽洁,而且對(duì)象一定屬于某個(gè)類(型)痘系。當(dāng)我們把一大堆擁有共同特征的對(duì)象的靜態(tài)特征(屬性)動(dòng)態(tài)特征(行為)都抽取出來(lái)后,就可以定義出一個(gè)叫做“類”的東西饿自。引用自100days教程汰翠。

8.3 類定義

日常生活中,我們會(huì)把相近的東西歸為一類璃俗,而且給這個(gè)類取個(gè)名字奴璃。比如,鳥(niǎo)類城豁。鳥(niǎo)類具有的共同屬性是有羽毛,通過(guò)產(chǎn)卵生育后代抄课。這個(gè)簡(jiǎn)單的例子可以用Python進(jìn)行如下的翻譯:

class Bird(object):
    feather = True
    reproduction = 'egg'

這里唱星,我們用關(guān)鍵詞“class”構(gòu)建一個(gè)類,類的名字就是“Bird”跟磨,類名后面的括號(hào)中有一個(gè)關(guān)鍵詞object间聊,即某一個(gè)個(gè)體。個(gè)體即是計(jì)算機(jī)語(yǔ)言中的對(duì)象抵拘,一個(gè)類別下哎榴,可以有多個(gè)個(gè)體。如鳥(niǎo)類就包括燕子僵蛛、烏鴉尚蝌、鷹等。

和前面學(xué)習(xí)的條件充尉、函數(shù)等的知識(shí)類似飘言,冒號(hào)和縮進(jìn)說(shuō)明后續(xù)的代碼屬于定義的這個(gè)類。我們定義了兩個(gè)量驼侠,一個(gè)用于說(shuō)明鳥(niǎo)類有羽毛(feather)姿鸿,另一個(gè)用于說(shuō)明鳥(niǎo)類的繁殖方式(reproduction)谆吴,這兩個(gè)量成為類的屬性(attribute),即靜態(tài)特征苛预。

除了用屬性來(lái)分辨類別外句狼,還會(huì)根據(jù)這類東西能做什么事情區(qū)分。比如热某,鳥(niǎo)會(huì)移動(dòng)鲜锚。這樣就把鳥(niǎo)和樹(shù)木的類別區(qū)分開(kāi)了。這樣一些“行為”屬性成為方法(method)苫拍,即動(dòng)態(tài)特征芜繁。

python通過(guò)在類內(nèi)部定義函數(shù)的來(lái)說(shuō)明或定義方法。

"""
python學(xué)習(xí)筆記-day08
面向?qū)ο?
version:0.1
author:chris
公眾號(hào):穎川河
"""


class MyClass():
    name = "Six Years"
    number = 35

    def sayhello():
        return "Good Morning Teacher!"


print("MyClass類屬性為:", MyClass.name, MyClass.number)
print("MyClass類方法為:", MyClass.sayhello())       

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

MyClass類屬性為: Six Years 35
MyClass類方法為: Good Morning Teacher!

8.4 對(duì)象

上面我們定義了類绒极,但是和前面學(xué)習(xí)過(guò)的函數(shù)類似骏令,還只是構(gòu)建模型打造兵器的過(guò)程。為了能夠使用我們定義的類(這件兵器)垄提,我們就要深入到對(duì)象的層面榔袋。

通過(guò)調(diào)用類,可以創(chuàng)造出這個(gè)類下面的一個(gè)對(duì)象铡俐。

將上面的例子做一下修改:

# 定義一個(gè)類
class MyClass():
    name = "Six Years"
    number = 35

    def sayhello(self):
        return "Good Morning Teacher!"


# 創(chuàng)建了一個(gè)對(duì)象chris
chris = MyClass()
# 訪問(wèn)類的屬性和方法
print("chris訪問(wèn)MyClass類屬性為:", chris.name, chris.number)
print("chris訪問(wèn)MyClass類方法為:", chris.sayhello())

修改后的例子總增加了一句:chris = MyClass()凰兑。通過(guò)這一句,我們創(chuàng)建了一個(gè)名稱為chris的對(duì)象审丘。這個(gè)對(duì)象怎樣引用或訪問(wèn)類的屬性和方法呢吏够?

對(duì)象對(duì)類屬性和方法的引用通過(guò)對(duì)象.屬性對(duì)象.方法函數(shù)。如上面例子中的最后兩句就是對(duì)象chris對(duì)MyClass類的屬性和方法的訪問(wèn)引用滩报。

輸出結(jié)果如下:

chris訪問(wèn)MyClass類屬性為: Six Years 35
chris訪問(wèn)MyClass類方法為: Good Morning Teacher!

從上面的例子可以看出锅知,描述對(duì)象的數(shù)據(jù)都存儲(chǔ)在類的屬性中,類的屬性描述了一個(gè)類的共性脓钾,所有屬于該類的對(duì)象都會(huì)共享這些屬性售睹。

對(duì)于一個(gè)類下面的全部個(gè)體來(lái)說(shuō),某些屬性可能存在個(gè)體差異可训。比如說(shuō)昌妹,某個(gè)鳥(niǎo)雖然具有羽毛和卵生的共性,但是顏色和別的鳥(niǎo)就有差異握截。因此飞崖,為了完整描述個(gè)體,除了共性類屬性外川蒙,我們還需要說(shuō)明個(gè)性的對(duì)象屬性蚜厉。

8.4 構(gòu)造方法

Python提供了一種特殊方法,方法名前后都有兩個(gè)__畜眨,如__init__()昼牛、__add__()等术瓮。對(duì)于__init__()方法,Python會(huì)每次創(chuàng)建對(duì)象的時(shí)候調(diào)用贰健,可在該方法內(nèi)部初始化對(duì)象屬性胞四。

class MyClass():
    class_name = "Six Years"
    student_number = 35

    def __init__(self, name):
        self.name = name
        print("Good Morning", name)

    def sayhello(self):
        return "Good Morning Teacher!"


chris = MyClass('Tim')
print(chris.sayhello())

輸出結(jié)果如下:

Good Morning Tim
Good Morning Teacher!

在上面的例子當(dāng)中,我們通過(guò)__init__方法說(shuō)明了這個(gè)類的初始化方式伶椿。每當(dāng)對(duì)象建立的時(shí)候辜伟,例如chris對(duì)象建立時(shí),__init__方法就會(huì)被調(diào)用脊另。他會(huì)設(shè)定name這個(gè)對(duì)象屬性导狡,這些屬性在對(duì)象創(chuàng)建的時(shí)候被執(zhí)行。

用廖雪峰老師的話說(shuō):注意到__init__方法的第一個(gè)參數(shù)永遠(yuǎn)是self偎痛,表示創(chuàng)建的實(shí)例本身旱捧,因此,在__init__方法內(nèi)部踩麦,就可以把各種屬性綁定到self枚赡,因?yàn)閟elf就指向創(chuàng)建的實(shí)例本身。

有了__init__方法谓谦,在創(chuàng)建實(shí)例的時(shí)候贫橙,就不能傳入空的參數(shù)了,必須傳入與__init__方法匹配的參數(shù)反粥,但self不需要傳卢肃,Python解釋器自己會(huì)把實(shí)例變量傳進(jìn)。

8.5 實(shí)例

定義一個(gè)類描述一個(gè)班級(jí)學(xué)生的成績(jī)等級(jí)星压。

"""
python學(xué)習(xí)筆記-day08
定義一個(gè)類描述學(xué)生成績(jī)等級(jí)

version:0.1
author:chris
公眾號(hào):穎川河
"""


class Grade(object):

    def __init__(self, name, score):
        self.name = name
        self.score = score

    def score_grade(self):
        if self.score >= 90:
            print("Brilliant! You Got an A")
        elif 80 <= self.score < 90:
            print("Great! You Got a B")
        elif 70 <= self.score <80:
            print('Good! You Got a C')
        else:
            print('What a Pity! You Got a D!')


student = Grade('Green', 85)
print(student.score_grade())

輸出結(jié)果如下:

Great! You Got a B

8.5 聲明

第一次接觸面向?qū)ο蠹粒瑢?duì)基本概念有了初步的認(rèn)識(shí)。這篇筆記中娜膘,大量引用了Vamei大神的《從Python開(kāi)始學(xué)編程》中的文字內(nèi)容。就是想通過(guò)學(xué)習(xí)敲字這樣的本辦法來(lái)加深對(duì)面向?qū)ο蟮睦斫狻?/p>

但是优质,文中的實(shí)例是根據(jù)自己的領(lǐng)悟來(lái)寫的竣贪。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市巩螃,隨后出現(xiàn)的幾起案子演怎,更是在濱河造成了極大的恐慌,老刑警劉巖避乏,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爷耀,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡拍皮,警方通過(guò)查閱死者的電腦和手機(jī)歹叮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門跑杭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人咆耿,你說(shuō)我怎么就攤上這事德谅。” “怎么了萨螺?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵窄做,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我慰技,道長(zhǎng)椭盏,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任吻商,我火速辦了婚禮掏颊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘手报。我一直安慰自己蚯舱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布掩蛤。 她就那樣靜靜地躺著枉昏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪揍鸟。 梳的紋絲不亂的頭發(fā)上兄裂,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音阳藻,去河邊找鬼晰奖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛腥泥,可吹牛的內(nèi)容都是我干的匾南。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蛔外,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蛆楞!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起夹厌,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤豹爹,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后矛纹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體臂聋,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了孩等。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艾君。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瞎访,靈堂內(nèi)的尸體忽然破棺而出腻贰,到底是詐尸還是另有隱情,我是刑警寧澤扒秸,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布播演,位于F島的核電站,受9級(jí)特大地震影響伴奥,放射性物質(zhì)發(fā)生泄漏写烤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一拾徙、第九天 我趴在偏房一處隱蔽的房頂上張望洲炊。 院中可真熱鬧,春花似錦尼啡、人聲如沸暂衡。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)狂巢。三九已至,卻和暖如春书聚,著一層夾襖步出監(jiān)牢的瞬間唧领,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工雌续, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留斩个,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓驯杜,卻偏偏與公主長(zhǎng)得像受啥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鸽心,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355