如何面向對象編程?程式設計師:我也要先有「對象」啊

摘要:面向對象編程是一種實現的方法,在這種方法中,程式被組織成許多組相互協作的對象,每個對象代表某個類的一個實例,而類則屬於一個通過繼承關係形成的層次結構。

本文分享自華為雲社區《Python 是如何面向對象編程的》,作者:宇宙之一粟 。

如何面向「對象」

天天跟我們這些苦逼的程式猿(媛)們喊著:「要面向對象編程」,你倒是給我新建一個對象嘛。你看看,都沒有對象,我怎麼面向對象編程嘛。網上關於Java和**C++**的面向對象編程相關介紹的部落格文章已經很多了,那我為什麼還寫呢?因為,人生苦短,剛好我是學Python的…

剛好今天當我在學習Python的OOP時,剛想吐槽這面向對象編程內容還挺多,突然就有一句亂入了——美女「編程」老太婆。???,這好不容易有個美女編程,怎麼變成了老太婆。

以上純屬瞎編,話說回來,能有個「對象」面向對象編程,一起變成糟老頭和老太婆也挺好的,你說對不對。

程式設計之面向對象編程

1.為什麼需要程式設計?

在建築行業,建築師一般不會想要為一幢100層的大樓添加一個地下室,因為這樣做無疑是成本過高,甚至有可能會失敗。(上半年剛監考過一級建築師考試,3.5小時的場地設計畫圖題看著都難。)

令人吃驚的是,在我們的軟體開發行業中,當用戶提出類似的改動時,都不會去多想。相反,老闆或者產品經理可能會說這是一個簡單的編程問題。(哈哈,這裡無意中傷程式設計師與產品經理…)

但是,軟體本質上是複雜的,隨著項目的迭代,複雜性往往超出了人類智慧的範圍。

2.是否存在「最好的」設計?

在每一種工程實踐中,設計都是一種訓練有素的方法。不管是函數式編程、泛型編程、並發編程、面向過程、基於對象、面向對象等的程式設計,我們通過設計方法來創造某個問題的解決方案,從而提供時間需求的途徑。

那麼,是否存在「最好的」設計方法?

這個問題可能沒有絕對的答案,但《沒有「銀彈」》告訴我們:沒有單純的技術或管理上的進步可以萬無一失地讓軟體工程從需求得到一個複雜系統的實現。所以,面向對象也不是解決軟體開發中所有問題的最後的「銀彈」,如今很多高級程式語言提供了多種編程設計範式,Python也不例外。

3.為什麼面向對象編程?

類是面向對象程式編程的主要工具,我們用它來定義新種類的方式,它在程式領域中反映了現實中的對象。而什麼是面向對象編程呢?

面向對象編程是一種實現的方法,在這種方法中,程式被組織成許多組相互協作的對象,每個對象代表某個類的一個實例,而類則屬於一個通過繼承關係形成的層次結構。

來看一下概念中的三個要點:

  1. 利用對象作為程式的基本單元,而不是演算法
  2. 每一個對象都是某個類的一個實例
  3. 類和類之間可以通過繼承關係聯繫在一起

滿足這三點才是叫面向對象的程式。我們用一個簡單的例子來模擬一下

接著,我們先了解一下面向對象的三個核心概念:

  1. 繼承。通俗理解,「兒子從父親那繼承下來的東西」。如果在一個類的基礎上創建新的有類,會將父類的屬性和方法直接繼承下來,從而減少重複程式碼的編寫。提供繼承資訊(財產)的我們稱為父類、或者基類、超類;得到繼承資訊的我們稱為子類、或派生類或衍生類。
  2. 多態。字面意思,「多種形態」,介面的不同實現方式即為多態。通過多態,子類可以擴展父類的能力,或者覆寫父類的操作。
  3. 封裝。我對封裝的理解,就像一個具有某些功能的黑箱子,隱藏一切可以隱藏的實現細節,然後對外提供簡單的編程介面。

面向對象編程提供了一種有效的編程方式,利用這種方式,我們將程式碼冗餘程度降到最低。因此,我們可以通過訂製已有的程式碼來編寫新的程式而不是在原處進行修改。

Python中的一切皆對象

在Python中,OOP是完全不是必須的,在初學階段也不需要使用類,利用函數結構也能寫出很多好用的腳本,完成很多有趣的編程。但是Python OOP也非常有意思,不信你跟我一起學學。

Java雖然也是面向對象編程的語言,但是血統沒有Python純正。比如Java的八種基本數據類型之一int,在持久化的時候,就需要包裝成Integer類對象。

與Java相比,Python的面向對象更徹底。學過Python的朋友可能知道,在Python中,把我們所有能看到的都變成對象——數字、字元串、元組、列表、字典、函數、方法、類、模組、包括你的程式碼。

怎麼理解這個過程呢?Python 中的一切都可以賦值給變數或者作為參數傳遞給函數,我們來看一下程式碼:

a = 3
b = a
print(a)# 列印:3
print(b)# 列印:3
def all_is_object():
 print("Learing Python OOP")
all_is_well = all_is_object
all_is_object() # 列印:Learing Python OOP
all_is_well()# 列印:Learing Python OOP
class Person():
 def __init__(self, name):
 print("姓名:", name)
A = Person
xiaoyu = A("小宇")# 姓名: 小宇

Python對象的三個特性

Python 的所有對象都有三個特性:身份(id)、類型(type)、值(value)

  • 身份(id):每個對象都有一個唯一的身份標識自己,任何對象的身份都可以使用內建函數 id() 來得到,可以簡單的認為這個值是該對象的記憶體地址。
a = 3
b = a
id(a)
id(b)
id(test_list)
  • 類型(type):對象的類型決定了對象可以保存什麼類型的值,有哪些屬性和方法,可以進行哪些操作,遵循怎樣的規則。可以使用內建函數 type() 來查看對象的類型。
a = 3
b = a
print(type(a))# <class 'int'>
print(type(int))# <class 'type'>
test_list = [1, 2, 3, 4, 5]
print(type(test_list))# <class 'list'>
print(type(list))# <class 'type'>
test_tuple = (1, 2, 3, 4, 5)
print(type(test_tuple))# <class 'tuple'>
print(type(tuple))# <class 'type'>
test_str = "I love python"
print(type(test_str))# <class 'str'>
print(type(str))# <class 'type'>
  • 值(value):對象所表示的數據
print(a) # 3
print(test_list)# [1, 2, 3, 4, 5]
print(test_str)# I love python

「身份」、”類型”和”值”在所有對象創建時被賦值。只要對象存在,這三個特性就一直存在。

總結

事實上,我們學習的軟體框架(framework)就是父類的集合,框架就是把常見的程式設計任務實現成類,我們所需要做的就是通過編寫自己的子類,組合和訂製已調試過的程式碼。此外,將常見的OOP結構歸類,就是我們的設計模式(design pattern),來協助解決設計中的問題。

這些軟體框架可能提供一些資料庫介面、測試協議、GUI工具包等

本章對類和面向對象編程進行了一些概念性的介紹,讓我們大致一覽OOP理想國的風景。

系列文章參考書籍:

  1. Python學習手冊(第5版)
  2. 面向對象分析與設計(第3版)
  3. Python Cookbook(第3版)

 

點擊關注,第一時間了解華為雲新鮮技術~