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ì)象
截止目前函匕,我學(xué)習(xí)的編程都是面向過(guò)程的。從今天開(kāi)始,我將學(xué)習(xí)一種全新思維的編程范式,面向?qū)ο螅∣bjected-Oriented)勺鸦。
Python不只是一門支持面向?qū)ο蟮木幊陶Z(yǔ)言,而且還是在多范式的外表下目木,用對(duì)象來(lái)構(gòu)建它的大框架换途。
面向?qū)ο蟛攀荘ython深層次的魅力。
面向過(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)題轻专。
類(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)寫的竣贪。