天天跟我們這些苦逼的程序猿(媛)們喊著:“要面向對象編程”,你倒是給我新建一個對象嘛。你看看,都沒有對象,我怎麼面向對象編程嘛。網上關於Java和**C++**的面向對象編程相關介紹的博客文章已經很多了,那我為什麼還寫呢?因為,人生苦短,剛好我是學Python的…
剛好今天當我在學習Python的OOP時,剛想吐槽這面向對象編程內容還挺多,突然就有一句亂入了——美女“編程”老太婆。???,這好不容易有個美女編程,怎麼變成了老太婆。
以上純屬瞎編,話說回來,能有個“對象”面向對象編程,一起變成糟老頭和老太婆也挺好的,你說對不對。
在建築行業,建築師一般不會想要為一幢100層的大樓添加一個地下室,因為這樣做無疑是成本過高,甚至有可能會失敗。(上半年剛監考過一級建築師考試,3.5小時的場地設計畫圖題看著都難。)
令人吃驚的是,在我們的軟件開發行業中,當用戶提出類似的改動時,都不會去多想。相反,老板或者產品經理可能會說這是一個簡單的編程問題。(哈哈,這裡無意中傷程序員與產品經理…)
但是,軟件本質上是復雜的,隨著項目的迭代,復雜性往往超出了人類智能的范圍。
在每一種工程實踐中,設計都是一種訓練有素的方法。不管是函數式編程、泛型編程、並發編程、面向過程、基於對象、面向對象等的程序設計,我們通過設計方法來創造某個問題的解決方案,從而提供時間需求的途徑。
那麼,是否存在**“最好的”**設計方法?
這個問題可能沒有絕對的答案,但《沒有“銀彈”》告訴我們:沒有單純的技術或管理上的進步可以萬無一失地讓軟件工程從需求得到一個復雜系統的實現。所以,面向對象也不是解決軟件開發中所有問題的最後的“銀彈”,如今很多高級編程語言提供了多種編程設計范式,Python也不例外。
類是面向對象程序編程的主要工具,我們用它來定義新種類的方式,它在程序領域中反映了現實中的對象。而什麼是面向對象編程呢?
面向對象編程是一種實現的方法,在這種方法中,程序被組織成許多組相互協作的對象,每個對象代表某個類的一個實例,而類則屬於一個通過繼承關系形成的層次結構。
來看一下概念中的三個要點:
滿足這三點才是叫面向對象的程序。我們用一個簡單的例子來模擬一下
接著,我們先了解一下面向對象的三個核心概念:
面向對象編程提供了一種有效的編程方式,利用這種方式,我們將代碼冗余程度降到最低。因此,我們可以通過定制已有的代碼來編寫新的程序而不是在原處進行修改。
在Python中,OOP是完全不是必須的,在初學階段也不需要使用類,利用函數結構也能寫出很多好用的腳本,完成很多有趣的編程。但是Python OOP也非常有意思,不信你跟我一起學學。
Java雖然也是面向對象編程的語言,但是血統沒有Python純正。比如Java的八種基本數據類型之一int,在持久化的時候,就需要包裝成Integer類對象。
與Java相比,Python的面向對象更徹底。學過Python的朋友可能知道,在Python中,把我們所有能看到的都變成對象——數字、字符串、元組、列表、字典、函數、方法、類、模塊、包括你的代碼。
怎麼理解這個過程呢?Python 中的一切都可以賦值給變量或者作為參數傳遞給函數,我們來看一下代碼:
a = 3b = aprint(a) # 打印:3print(b) # 打印:3def all_is_object(): print("Learing Python OOP") all_is_well = all_is_objectall_is_object() # 打印:Learing Python OOPall_is_well() # 打印:Learing Python OOPclass Person(): def __init__(self, name): print("姓名:", name) A = Personxiaoyu = A("小宇") # 姓名: 小宇
Python 的所有對象都有三個特性:身份(id)、類型(type)、值(value)
a = 3b = aid(a)id(b)id(test_list)
a = 3b = aprint(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'>
print(a) # 3print(test_list) # [1, 2, 3, 4, 5]print(test_str) # I love python
“身份”、"類型"和"值"在所有對象創建時被賦值。只要對象存在,這三個特性就一直存在。
事實上,我們學習的軟件框架(framework)就是父類的集合,框架就是把常見的程序設計任務實現成類,我們所需要做的就是通過編寫自己的子類,組合和定制已調試過的代碼。此外,將常見的OOP結構歸類,就是我們的設計模式(design pattern),來協助解決設計中的問題。
這些軟件框架可能提供一些數據庫接口、測試協議、GUI工具包等
本章對類和面向對象編程進行了一些概念性的介紹,讓我們大致一覽OOP理想國的風景。
系列文章參考書籍:
- Python學習手冊(第5版)
- 面向對象分析與設計(第3版)
- Python Cookbook(第3版)