04 Python 基礎教學10 所有文章

[Python教學]物件導向-Class類的封裝/繼承/多型

python-oop

本篇記錄了學習 Python 物件導向的筆記,從最初的 Class 類別定義開始、到物件導向的三大核心特性:繼承、封裝和多型,都有詳細的筆記和解釋。

 ▍學習物件導向設計原因:

  1. 使程式碼的維護和擴充更容易
  2. 使人更容易閱讀理解程式碼邏輯

 ▍本篇大綱

  1. 首先用 Class 來定義類別
  2. OOP 特性一. 繼承 (inheritance)
  3. OOP 特性二. 封裝 (encapsulation)
  4. OOP 特性三. 多型 (polymorphism)
  5. 補充:類的其他呼叫方式

首先用 Class 來定義類別

在物件導向中,類別是所有共同物件成員的抽象描述,它定義該類別物件共同具有的屬性,及實現該物件的方法。

Python 建立 class,通常類名採用大寫 (下面範例為 Employee ),在類中可以定義屬性和方法。

以下為簡單的 class 類範例:
1. self.working_hour = 0 為定義屬性
2. def work(self): 為定義方法

class Employee:
    def __init__(self):
        self.working_hour = 0 #屬性

    def work(self): #方法
        self.working_hour += 1
        print(‘Working:’, working_hour)

andy = Employee()  # 類的實例化
andy.work() # 呼叫類的方法
print(andy.working_hour) # 呼叫類的屬性

▍Python class 自由度很高,定義屬性的三種方法

class ThisTestClass:
    getName = 'Max'  #方法一:把屬性定義寫在init外面

    def __init__(self):
        self.getNameFromInit = ‘Max__init__’  #方法二:把屬性定義寫在init內
        pass


if __name__ == “__main__”:

    task = ThisTestClass()
    task.sendName = ‘Max_sendName’  ##方法三:自己給屬性與參數

    print(task.getName)
    print(task.getNameFromInit)
    print(task.sendName)

>>> Max
>>> Max__init__
>>> Max_sendName

▍物件導向有三大基本特性,分別是:

  1. 封裝 (encapsulation)
  2. 繼承 (inheritance)
  3. 多型 (polymorphism)

特性一. 繼承 (inheritance)

▍簡單來說:繼承就像是生活中,子女繼承父母的財產一樣。

實作 class 繼承範例:首先 Employee 是這次的父親,而 Andy 是繼承 Employee 的孩子

  1. 程式範例第四行 class Andy(Employee),這邊讓 Andy 繼承 Employee物件
  2. 程式範例第六行 super().init(),這邊 super 是呼叫父類別的語法,所以繼承了父親的能力
  3. 程式範例第十行 print(‘tree:’, self.cut_tree),繼承後即可調用父親能力

而如果子類有與父類擁有同名的函式,則子類會會覆蓋掉父類的函式。

class Employee:
    def __init__(self):
        self.cut_tree = 3

class Andy(Employee):
    def __init__(self, get_gold):
        super().__init__()
        self.get_gold = get_gold

    def getDetials(self):
        print('==getDetals==')
        print('tree:', self.cut_tree)
        print('gold:', self.get_gold)


if __name__ == "__main__":
    andy = Andy(1)
    andy.getDetials()

>>> tree: 3
>>> gold: 1

特性二. 封裝 (encapsulation)

▍簡單來說:隱藏程式實現細節只保留下接口,使程式容易模組化。

封裝從字面上理解就是包裝的意思,像是手機,從開機、打電話到上網我們都都不知道背後具題實現細節,但只需要按下按鈕就可以完成,這功能就是封裝。

以下範例 work() 就是封裝的表現,可以讓外部使用者不需考慮內部實作而直接呼叫使用。

若是有不想被呼叫的變數,直接在前面加上 __ 像是 __sleep即可以成為私有變數,如果使用者呼叫 __sleep 時則會噴 object has no attribute 的錯誤。

class Employee:
    def __init__(self):
        self.cut_tree = 3

    def work(self):
        print(‘Working’)

    def __sleep(self):
        print(‘Sleeping’)


if __name__ == “__main__”:
    Andy = Employee()

    andy.work()
    >>> Working

    andy.__sleep()
    >>> AttributeError: ‘Employee’ object hasno attribute ‘__sleep’

特性三. 多型 (polymorphism)

▍簡單來說:呼叫同名的方法時,會得到不同的結果。

如下範例 Employee、Andy 和 Joy 類別都同時擁有 work 的方法,但呼叫 w.work()、w1.work()、w2.work() 時卻有各自的表現形態。Python 會根據呼叫的類別來決定要執行哪個方法實作,這就是多型的意思。

class Employee:
    def work(self):
        print(‘Employee work’)

class Andy(Employee):
    def work(self):
        print(‘Andy work’)

class Joy(Employee):
    def work(self):
        print(‘Joy work’)


w = Employee()
w1 = Andy()
w2 = Joy()

w.work()
w1.work()
w2.work()

>>> Employee work
>>> Andy work
>>> Joy work

補充:類的其他呼叫方式

class Employee:
    ‘’’這是__doc__資訊'''
    def work(self):
        print(‘Employee work’)


w = Employee()

print(w.__doc__)
print(w.__class__)
print(Employee.__dict__)

>>> 這是__doc__資訊
>>> <class ‘__main__.Employee’>
>>> {‘__module__’: ‘__main__’, ‘__doc__’:’這是__doc__資訊’, ‘work’: <function Employee.work at 0x10c579598>, ‘__dict__’: <attribute ‘__dict__’ of ‘Employee’ objects>, ‘__weakref__’: <attribute’__weakref__’ of ‘Employee’ objects>}

[Python教學]物件導向-Class類的封裝/繼承/多型 結束囉,感謝收看!

Python相關教學延伸閱讀:

有關Max行銷誌的最新文章,都會發佈在Max的Facebook粉絲專頁,如果想看最新更新,還請您按讚或是追蹤唷!

發佈留言

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