面向對象的三個基本特性——封裝、多態、繼承詳解


面向對象是Python最重要的特性,在Python中所有數據類型都是面向對象的,所謂萬物皆對象一點都不誇張!函數、變量、字符串裏

面向對象概述(OOP)

面向對象的編程思想是,按照真實世界客觀事物的自然規律進行分析

例如,在真實世界中,會有老師學生等實體,學生有學號姓名所在的班級屬性(數據),學生還有學習提問吃飯走路等操作。學生只是抽象的描述,這個抽象的描述稱爲“類”,在學校裏活動的是學生,即張三李四同學,這些同學叫做“對象”,對象也稱爲“實例”

現實世界有類和對象,軟件世界也有面向對,只不過是會以某種計算機語言編寫的存在,即面向對象編程(Object Oriented Programming,OOP)

與面向對象相對的就是面向過程編程,做一個例子:你想吃魚香肉絲,自己買材料,肉,魚香肉絲調料,蒜薹,胡蘿蔔等等然後切菜切肉,開炒,盛到盤子裏,就是面向過程;而面向對象是,去飯店,張開嘴:老闆!來一份魚香肉絲!

看出區別了嗎?面向對象有什麼優勢呢?首先你不需要知道魚香肉絲是怎麼做的,降低了耦合性。如果你突然不想吃魚香肉絲了,想吃洛陽白菜,對於面向過程你可能不太容易了,還需要重新買菜,買調料什麼的。對於面向對象,太容易了,大喊:老闆!那個魚香肉絲換成洛陽白菜吧,提高了可維護性。總的來說就是降低耦合,提高維護性!

面向對象的底層其實還是面向過程,把面向過程抽象成類,然後封裝,方便我們我們使用的就是面向對象了。

對比面向對象和麪向過程

  • 面向過程
    • 優點:性能比面向對象好,因爲類調用時需要實例化,開銷比較大,比較消耗資源。
    • 缺點:不易維護、不易複用、不易擴展。
  • 面向對象:
    • 優點:易維護、易複用、易擴展,由於面向對象有封裝、繼承、多態性的特性,可以設計出低耦合的系統,使系統 更加靈活、更加易於維護 。
    • 缺點:性能比面向過程差

面向對象編程和麪向過程編程有哪些語言

  • 面向過程
    • 典型的有C語言、Fortran、Pascal、PHP(PHP又可以面向對象又可以面向過程)
  • 面向對象
    • C++、Java、Delphi、C#、PHP

面向對象的三個基本特性——封裝、繼承、多態

1封裝性

​ 例如,一臺計算機內部極其複雜,有主板、CPU、硬盤和內存,而一般用戶不需要知道這些,只要直接使用就可以,不需要知道主板的型號、CPU主頻、硬盤和內存的大小(這個可能需要知道一點)。使用機箱將所有部件封裝起來,對外提供一些接口,這樣用戶使用十分方便

封裝就是隱藏對象的屬性和實現細節,僅對外公開接口,控制在程序中屬性的讀和修改的訪問級別,將抽象得到的數據和行爲(或功能)相結合,形成一個有機的整體,也就是將數據與操作數據的源代碼進行有機的結合,形成“類”,其中數據和函數都是類的成員。

封裝的目的是增強安全性和簡化編程,使用者不必瞭解具體的實現細節,而只是要通過外部接口,以特定的訪問權限來使用類的成員。

面相對象的不就是使用程序處理事情時以對象爲中心去分析嗎,與面向過程不同,面向過程關心處理的邏輯、流程等問題,而不關心事件主體。而面向對象即面向主體,所以我們在解決問題時應該先進行對象的封裝(對象是封裝類的實例,比如張三是人,人是一個封裝類,張三隻是對象中的一個實例、一個對象)。比如我們日常生活中的小兔子、小綿羊都可以封裝爲一個類。

在這裏插入圖片描述

比如兔子的屬性有兩隻耳朵、四隻腿、一雙眼睛、三瓣嘴等;行爲(功能)有跑、跳、吃素等。

2繼承性

​ 現實世界中繼承性也無處不在。例如輪船與客輪之間的關係,客輪是一種特殊的輪船,在面向對象中,輪船是一般類,客輪是特殊類,特殊類擁有一般類的所有數據和操作,一般類稱爲“父類”或“超類”,特殊類稱爲“子類”或“派生類”。或者拿文具做例子,文具是根類,那麼寫字筆、便籤就是文具繼承的子類,也可以

在這裏插入圖片描述

如果品類更加的複雜,可以先分爲:學生文具、辦公文具、財會用品,然後在每個品類下面再根據具體的作用去劃分。這些被劃分出來的子類別都一定具有父類別的某些共同特徵或用途,並且有可能存在多級的分類關係,那麼如果我們使用面向對象的語言去描述出這樣一種關係就可以使用繼承。
在這裏插入圖片描述

​ 再比如Qt中的對象樹就是一個繼承關係,比如按鈕類QPushButton類,就是一個控件類,其父類是QAbstractButton類,QAbstractButton又繼承於QWidget類,QWidget類又繼承於QObject類,QObject類就是一個根類(超類),一個無所不能裝,大餅夾一切的類,所有的類都繼承於QObject,當然這是Qt。

在這裏插入圖片描述

這就是對象樹,Python的根類是object,也是無所不能裝,大餅夾一切的類,我們所有定義的class都會隱式的繼承Object,就是如果我們的類沒有顯示的指定父類,那麼會自動認爲Object是父類

3多態性

就是父類中成員被子類繼承之後,可以具有不同的狀態或表現行爲

本章結束了,這是一個比較難的地方,肯定說的有很多差勁、錯誤的地方,歡迎提出問題改進!一起加油!

🚀🚀快快點贊收藏留言關注!

🤖🤖我的Github:<https://github.com/Github-Programer

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