第十屆鐵人賽 flask-restful DAY08-搞懂Python的OOP

什麼是OOP

相信軟體開發工程師對於這詞應該不陌生,所以我就多做贅述了,我只提及其重要的四個觀念在Python如何實作:

繼承

繼承的語法相較之下比較簡單請各位讀者看以下例子:

class Animal:
    name = ''

    def __init__(self, name):
        self.name = name

    def walk(self):
        print('walking')

    def eat(self):
        print('eating')

class Dog(Animal):
    def __init__(self, name):
        super().__init__(name)

    def walk(self):
        print('{0} using foot walk'.format(self.name))

    def eat(self):
        print('{0} eat bone'.format(self.name))

animal = Dog('A')
animal.eat()
animal.walk()

由上述程序說明了Python使用( )`表示所繼承的物件,當要使用時只要`類別名稱()`即可產生一個型別為該`類別名稱的物件。
再進一步說明,這裏的self`指的是物件實體,當要使用物件的屬性時都要加上`self.`前綴詞。再來`__init__`是類別的建構子,當使用`類別名稱()`會先呼叫建構子,並執行建構子的程序,在Dog的例子中會給予該物件一個名字,再來`super是呼叫父類別的語法,上述例子是建構子中呼叫父類別的建構子並將名稱賦予進去。

封裝

在上述繼承的例子中eat()``walk() `就是封裝的表現,讓外部使用者直接使用而不需考慮內部實作,若是在開發中如果有私有變數不希望讓外部使用者,或者是被繼承的類別使用的可以使用`__前綴詞來命名變數名稱例如:

class Animal:
    name = ''
    __private = ''
    def __init__(self, name):
        self.name = name

    def walk(self):
        print('walking')

    def eat(self):
        print('eating')

多型

接承上述例子,在多建立一個class繼承上述的Animal並實作eat()``walk()`之後當實體物件以Dog產生則其`eat()``walk()`會依據Dog的實作來執行,若以新的class來產生實體則會依據新class的`eat()``walk()實作來執行,請見以下例子:

class Duck(Animal):
    def __init__(self, name):
        super().__init__(name)

    def walk(self):
        print('{0} using two foot walk'.format(self.name))

    def eat(self):
        print('{0} eat worm'.format(self.name))

animal = Dog('A')
animal = Duck('A')
animal.eat()
animal.walk()

結果會是顯示以下內容:

A using two foot walk
A eat worm

抽象

抽象的表現是為實作的class不能產生實體,而該class僅是定義一個模板告訴實作者要實作什麼內容,儘管Python根本上沒有修飾詞可以宣告抽像類別,但是仍可透過擴充函式庫來做到,待後續再補充相關資料。

小結

透過本章的說明希望各位讀者們可以對Python的OOP有更進一步的了解。在說完OOP已經方法後下一章要介紹另一個可以把程序寫的更簡潔的裝飾器,在說明裝飾器後會再針對類別的進階內容再作補充,敬請期待。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *