python基礎四_01_面向對象

python基礎四_01_面向對象編程

導讀:
本文主要從what?why?how?三個方向理解面向對象編程的思想;僅供自己梳理。

一、什麼是面向對象編程?

面向對象編程與面向過程編程是兩種常見的編程思想。先通過引子來看下:

引子1:

    話說三國時期,曹操帶領百萬大軍攻打東吳,大軍在長江赤壁駐紮,軍船連成一片。
眼看就要滅了東吳,統一天下,曹操大悅,於是大宴衆文武。在酒席間,曹操詩性大發,
不覺吟道:"喝酒唱歌,人生真爽..."。衆文武齊呼:”丞相好詩!“於是命印刷工匠刻版印刷
,以便流傳天下。
    版樣給曹操一看,曹操感覺不妥,說道”喝與唱,此話過俗,應改爲‘對酒當歌’較好!
於是命工匠重新雕刻。那時候,還沒發明活字印刷術,如果樣板要改,只能重頭雕刻。
工匠眼看連夜刻版之工,徹底白費,心中叫苦不迭。只得照辦。
    版樣再次出來請曹操過目,曹操細細一品,覺得還是不好,說“人生真爽太過直接,
應該改問語纔夠意境,因此應改爲‘對酒當歌,人生幾何?’”,於是....
    在活字印刷術還沒出現之前,如果版樣有改動,只能重新雕刻(這個就相當於面向過程)。
而且在印刷完成後,這個樣板就失去了它的價值,如果需要其他樣板只能重新雕刻。而活字印刷
術的出現就大大改善了印刷技術。如上例”喝酒唱歌,人生真爽“,如果用活字印刷,只需要改四
個字就可,其餘工作都未白做。豈不快哉!!

    活字印刷也反應了面向對象(OOP)。當要改動時,只需要改要改的地方,此爲可維護;
當這些字用完後,並非就完全沒有價值了,它完全可以在後來的印刷中重複使用,此乃可複用;
下次詩若要加字,只需另刻字加入即可,這就是可擴展;字的排列可以橫排,也可以豎排,
此是靈活性好。

引子2:

假如我們要做一個五子棋遊戲,從兩種設計思路來分析一下。

面向過程的設計思路:
面向過程的設計思路就是首先分析問題的步驟:
1、開始遊戲,
2、黑子先走,
3、繪製畫面,
4、判斷輸贏,
5、輪到白子,
6、繪製畫面,
7、判斷輸贏,
8、返回步驟2,
9、輸出最後結果。
把上面9個步驟用不同的方法來實現。
面向對象的設計思想
面向對象的設計則是從另外的思路來解決問題。整個五子棋可以分爲三個部分。
1、黑白雙方,這兩方的行爲是一模一樣的,
2、棋盤系統,負責繪製畫面,
3、規則系統,負責判定諸如犯規、輸贏等。
第一類對象(玩家對象)負責接受用戶輸入,並告知第二類對象(棋盤對象)棋子佈局的變化,棋盤對象接收到了棋子的變化就要負責在屏幕上面顯示出這種變化,同時利用第三類對象(規則系統)來對棋局進行判定。

通過以上兩個引子,我們已經對面向過程和麪向對象有了初步的瞭解。

二、爲什麼要面向對象編程?

1.面向過程與面向對象的編程思維對比:

面向過程是具體化的,流程化的,解決一個問題,你需要一步一步的分析,一步一步的實現。
面向對象是模型化的,結構化的。當解決一個問題的時候,面向對象會把事物抽象成對象的概念,就是說這個問題裏面有哪些對象,然後給對象賦一些屬性和方法,然後讓每個對象去執行自己的方法,問題得到解決。
面向對象的底層其實還是面向過程,把面向過程抽象成類,然後封裝,方便我們我們使用的就是面向對象了。

2.面向過程與面向對象的優缺點對比:

(1).面向過程:

優點:性能比面向對象好,因爲類調用時需要實例化,開銷比較大,比較消耗資源。
缺點:不易維護、不易複用、不易擴展.

(2).面向對象:

優點:易維護、易複用、易擴展,由於面向對象有封裝、繼承、多態性的特性,可以設計出低耦合的系統,使系統更加靈活、更加易於維護 .
缺點:性能比面向過程差

三、怎樣面向對象編程?

1.面向對象的哲學

萬物皆對象

類是對象的模板,對象是類的實例化。

2.相關概念和詞彙

面向對象有些概念不搞明白含義,我們就無法進行編程。比如:類,對象,屬性,方法,實例和實例化,父類,子類等等。這些都是啥意思?

(1).類是具有相同或相似性質的對象的抽象。如:人類,狗類,車類,槍類,魚類,水果類,美食類,藝術類等等。它們都有相似的性質,但是它們是抽象的,並不是客觀存在的,比如:你能拿出來一水果叫‘水果’嗎?當然不能,因爲‘水果’是一個抽象的概念,並不是某個具體的水果。同樣,人類也是一樣的道理。所以說類是對象的模板。
(2).‘人類’是‘黃種人類’的父類,‘黃種人類’是‘人類’的子類。
(3).對象是類的具體化。比如:‘張三’這個實例就是從‘人類’這個類中實例化出來的一個對象。
(4).屬性描述了對象的狀態。如:年齡。
(5).方法描述了對象的行爲。如:吃飯。

我們通過下面的例子來看下:

# 類
人類---------------------------------------父類
黃種人類-----------------------------------子類
# 對象
張三---------------------------------------對象(實例)
# 屬性
性別,年齡,身高----------------------------公有屬性(所有人類都有的屬性)
備胎---------------------------------------私有屬性(備胎屬性是張三的私有屬性)
# 方法
走路,吃飯,說話,睡覺----------------------公有方法(人類都有的方法)
舔狗---------------------------------------私有方法(舔狗技能是張三的私有技能)

3.python面向對象編程簡單實戰

# 創建一個貓類:Cat
class Cat:
    # 定義一個貓叫的方法:call
    def call(self):
        print('喵喵喵~~~')

# 通過Cat類,實例化一個tom對象
tom = Cat()
# 貓叫:tom貓調用call方法
tom.call()

四、總結

1.通過以上對oop簡單瞭解。

2.oop面向對象編程是一種思想,思維的轉變很重要。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章