如何理解「面向對象」編程思想

理解面向對象,首先理解要它的基礎概念:程序員

面向對象是將現實問題構建關係,而後抽象成 類 ( class ) ,給類定義屬性和方法後,再將類實例化成 實例 ( instance ) ,經過訪問實例的屬性和調用方法來進行使用。編程

在不一樣的語言中,對象的定義範圍不一樣。在 Python 中 類 和 類的實例 都稱爲 對象 ( Object ),由於 Python 的類是更頂級的 type 實例化後的對象;而在 Java 等靜態語言中,通常把類的實例稱爲對象。微信

 

理解了理論知識後,接着經過例子,再理解面向對象的三大特徵:封裝、繼承、多態。app

下邊咱們把女媧造人的神話故事用面向對象來敘述一遍:dom

假設咱們是女媧(程序設計者),咱們忽然有個想法,想造一羣和本身差很少的小人,小人須要有男女兩種性別,外觀和行爲也有一些差別。那首先咱們分析出,無論什麼性別,都應該有四肢,因此咱們先仿照本身的構造,在腦海中構思泥人的樣子(抽象成基類),而後先賦予泥人一些共有的行爲(定義類的實例方法):函數

class Human(object):

    def __init__(self, name='泥人'):
        // 有個名字,有兩隻手,兩條腿
        self.name = name
        self.hands = 2
        self.legs = 2

    def introduce_self(self):
        // 介紹本身
        print('我是%s' % self.name)

而後咱們先捏3個泥人,並給他們取了不一樣的名字:spa

>>> a = Human('大強子')
>>> b = Human('二狗子')
>>> c = Human('三愣子')

咱們讓其中一我的介紹本身:設計

>>> a.introduce_self()
我是大強子

而後咱們繼續完成想法,須要給泥人增長兩種性別,而且異性之間能結婚,咱們開始在剛纔泥人模型的基礎上(繼承於基類),構思出兩種性別的泥人的區別(設置不一樣的屬性),而後讓他們均可以工做,但工做的內容不同(調用相同的方法出現不一樣結果,是多態性),並決定讓男人能夠娶女人(將這個行爲定義爲男人的方法)。code

import random

class Female(Human):

    def __init__(self, name):
        // 調用父類的初始化方法,依然有名字、兩隻手、兩條腿
        super().__init__(name)
        // 頭髮和力量進行隨機取值
        self.hair = random.randint(3, 5)
        self.power = random.randint(1, 3)
        // 是否已婚
        self.married = False

    def work():
        print('%s採摘了一些果子' % self.name)

class Male(Human):

    def __init__(self, name):
        super().__init__(name)
        self.hair = random.randint(0, 2)
        self.power = random.randint(2, 5)
        self.married = False

    def work():
        print('%s出去打獵了一天' % self.name)

    def marry(self, other):
        // 判斷本身或對方是否已結婚,不然拋出異常
        if self.married is True or other.married is True:
            raise ValueError('法律不支持屢次結婚')
        // 判斷對方是不是女性,不然拋出異常
        if instance(other, Female):
            self.married = True
            other.married = True
        else:
            raise TypeError('法律不支持同性結婚')

而後咱們就可讓小人活動起來:對象

>>> a = Male('大強子')
>>> b = Male('二狗子')
>>> c = Female('翠花')
>>> for h in [a, b, c]:
...     // 調用父類的方法
...     h.introduce_self()
我是大強子
我是二狗子
我是翠花
>>> for h in [a, b, c]:
...     // 多態性使相同的方法產生不一樣的結果
...     h.work()
大強子出去打獵了一天
二狗子出去打獵了一天
翠花采摘了一些果子
>>> a.marry(c)
>>> a.married
True
>>> c.married
True
>>> b.marry(c)
ValueError: 法律不支持屢次結婚
>>> b.marry(a)
TypeError: 法律不支持同性結婚

 

看到這裏你應該會發現,面向對象是更接近人類思惟模式的編程思想,在這種能夠具象化的需求中,能夠極大簡化其中的邏輯,讓咱們關注於設計對象的屬性和方法。

雖然你確實能夠經過寫一長串函數來達到一樣的效果,那實際是另外一種編程思想:面向過程,經過函數實現過程當中一系列的功能,最後按順序組合後達成需求。

這並非面向過程弱於面向對象,而是在不一樣的需求中要選擇最合適的設計思路,好比在設計順序執行的腳本中,明顯面向過程的設計思路是更加適合,若是咱們還去定義類就有些累贅了。

這也是題主提出的疑問,正是由於沒有遇到適合面向對象的需求。

若是是擁有複雜關係的需求,咱們就應該儘量將互相有關聯的行爲抽象成類,好比每個網頁,網頁中每個組件 等等。實際上面向對象幫助咱們在十萬行代碼的大型項目中,仍然能夠遊刃有餘,正由於如此,才能發展爲目前應用最爲普遍的編程思想。

 


 

最後,不論是面向什麼編程,終究仍是要面向人生

歡迎關注個人微信公衆號:面向人生編程

不管什麼樣的編程思想,都不應只存留在代碼之中,更應伴隨於整我的生旅途,這個公衆號不僅聊技術,還會聊產品/互聯網/經濟學等普遍話題,因此也歡迎非程序員關注。

相關文章
相關標籤/搜索