【Python】Python語言學(xué)習(xí):面向?qū)ο缶幊?,類和對象,封裝、繼承和多態(tài)
這一周Python語言學(xué)習(xí),記錄如下。
01
面向?qū)ο缶嶰OP
1.1 為什么學(xué)習(xí)和應(yīng)用OOP?
1 OOP適合更加復(fù)雜的需求分析和項(xiàng)目開發(fā)。
2 OOP具有更強(qiáng)大的封裝能力。
3 OOP相比于面向過程編程(OPP),是另一種編程思維,從
誰來做思考需求分析和代碼設(shè)計與開發(fā)。4 OOP可以提升我數(shù)據(jù)科學(xué)工作的效率。
1.2 什么是OOP?
OOP全稱是(Object Oriented Programming),面向?qū)ο缶幊?,一種編程思維和方式。
面對需求分析時,OPP會思考怎么做這個需求,而OOP會思考誰來做這個需求,并且進(jìn)一步思考這個誰需要具備什么特征和行為,即這個誰的屬性和方法。通過OOP,可以把這個誰的屬性和方法封裝在一起,做成一個類。類是一種抽象,類似建房子的圖紙;對象是類的具體化或者實(shí)例化,類似按著圖紙建成一棟棟房子。這個房子有什么特征和能夠做什么,就取決于房子的圖紙(類)的先前的設(shè)計。你會發(fā)現(xiàn),面向?qū)ο缶幊蹋咏覀兊纳?,更能夠靈活性地表達(dá)我們的生活。
1.3 怎么學(xué)習(xí)OOP?
通過OOP的概念,我們發(fā)現(xiàn),學(xué)習(xí)OOP時,我們需要學(xué)習(xí)這些內(nèi)容:
1 OOP是一種編程思維和方式。
2 OOP的需求分析是從
誰來做開始的,并且要想清楚這個誰要有什么職能。3 OOP的兩個核心概念:類和對象。
4 OOP的三個重要特性:封裝、繼承和多態(tài)。
5 OOP的屬性和方法的類型,例如實(shí)例屬性和方法、類屬性和方法、靜態(tài)方法。
6 學(xué)習(xí)和使用OOP來設(shè)計和實(shí)現(xiàn)負(fù)責(zé)的項(xiàng)目和系統(tǒng)。
02
類和對象
2.1 概念描述
類和對象是OOP的兩個核心概念。
類是抽象,不能直接使用,它是對一群具有相同特征或者行為的事物的一個統(tǒng)稱。
1 特征稱為屬性
2 行為稱為方法
對象是具體的,可以直接使用,它是類的具體存在,具有類所設(shè)計的屬性和方法。
舉例說明:
類相當(dāng)于建房圖紙,對象相當(dāng)于按著建房圖紙建造的一棟棟樓房。
在程序開發(fā)中,應(yīng)該先有類,再有對象;應(yīng)該先設(shè)計要使用的類,再設(shè)計其它類;設(shè)計類的時候遵循奧卡姆剃刀原則,即類設(shè)計的時候,不要增加沒有的或者不必要的屬性和方法。
2.2 類設(shè)計和生成
使用關(guān)鍵詞class來設(shè)計類。
簡單示例。
需求分析,需求如下
18歲的小明喜歡跑步和讀書。
20歲的小紅也喜歡跑步和讀書。
根據(jù)需求,我們創(chuàng)建一個Person類,具有姓名和年齡屬性,跑步和讀書方法。
參考代碼如下:
# 設(shè)計Person類
class Person:
# 創(chuàng)建實(shí)例屬性
def __init__(self, name, age):
self.name = name
self.age = age
# 創(chuàng)建實(shí)例方法
def run(self):
print("%d歲的%s喜歡跑步" % (self.age, self.name))
def read(self):
print("%d歲的%s喜歡跑步" % (self.age, self.name))
# 生成小明對象
xiao_ming = Person("小明", 18)
xiao_ming.run()
xiao_ming.read()
# 生成小紅對象
xiao_hong = Person("小紅", 20)
xiao_hong.run()
xiao_hong.read()
結(jié)果如下。

03
封裝
封裝是面向?qū)ο缶幊痰囊淮筇匦浴?br>OOP的第一步,把屬性和方法封裝到一個抽象類中。
外界使用類創(chuàng)建對象,然后用對象調(diào)用方法。
對象方法的細(xì)節(jié)被封裝在類的內(nèi)部。
前面的Person類就采用了封裝技術(shù)。
04
繼承
OOP有三大特性,分別是封裝、繼承和多態(tài)。
1 封裝,根據(jù)這個誰的職能將屬性和方法封裝到一個抽象的類中
2 繼承,實(shí)現(xiàn)代碼重用,相同的代碼不需要重復(fù)編寫。編寫程序時,請遵循不寫重復(fù)代碼塊的原則。
3 多態(tài),不同的對象調(diào)用相同的方法,產(chǎn)生不同的執(zhí)行結(jié)果,增加代碼的靈活度,讓代碼可做更豐富的功能。
繼承的知識點(diǎn),羅列如下:
子類繼承自父類,可以直接享受父類中已經(jīng)封裝好的方法,不需要再次開發(fā)。
子類根據(jù)自己職能,封裝子類特有的屬性和方法。
繼承具有傳遞性。
當(dāng)父類的方法實(shí)現(xiàn)不能滿足子類需求時,可以對父類方法進(jìn)行重寫(一種是覆蓋父類的方法,另一種是對父類方法功能進(jìn)行擴(kuò)展,需要的位置使用
super().父類方法)子類對象不能直接訪問父類的私有屬性和方法(一種隱私保護(hù)技術(shù)),可以通過父類的公有方法間接訪問。
子類可以多個繼承類,比方說,孩子類繼承父親和母親類的特性和方法。多重繼承的時候,避免各個類里面具有相同的方法。
如果沒有父類,建議統(tǒng)一繼承自
object。
05
多態(tài)
多態(tài)是指不同的子類對象調(diào)用相同的父類方法,會產(chǎn)生不同的執(zhí)行結(jié)果。
多態(tài)的知識點(diǎn):
1 多態(tài)的好處,增加代碼的靈活度
2 多態(tài)的構(gòu)建,以繼承和重寫父類方法為前提。
繼承和多態(tài)的一個簡單實(shí)例。
需求分析:
HR需要招聘程序員和設(shè)計師,基于OOP采用繼承和多態(tài)編寫代碼。
參考代碼:
class Person(object):
def __init__(self, name):
self.name = name
def work(self):
print("%s喜歡工作" % self.name)
class Programmer(Person):
def work(self):
print("%s編寫代碼" % self.name)
class Designer(Person):
def work(self):
print("%s設(shè)計UI" % self.name)
class HumanResources(object):
def __init__(self, name):
self.name = name
def hr_with_person(self, person):
print("%s招聘%s" % (self.name, person.name))
# 人才的工作職責(zé)
person.work()
# 創(chuàng)建一個程序員對象
xiao_ming = Programmer("小明")
# 創(chuàng)建一個設(shè)計是對象
xiao_hong = Designer("小紅")
# 創(chuàng)建一個HR對象
xiao_fang = HumanResources("小芳")
# 招聘程序員
xiao_fang.hr_with_person(xiao_ming)
# 招聘設(shè)計師
xiao_fang.hr_with_person(xiao_hong)
結(jié)果如下:

06
總結(jié)
OOP是一種編程方式和思維框架,掌握和熟悉OOP,可以響應(yīng)更加復(fù)雜的需求和開發(fā)更加復(fù)雜的系統(tǒng)。
OOP的兩大核心概念是類和對象,三大特性是封裝、集成和多態(tài)。
往期精彩回顧
