介面

Python 物件導向程式設計進階

Jake Roach

Data Engineer

介面

一種只包含抽象方法的特殊類別,為實作該介面的類別建立「契約」

  • 必須定義抽象方法
  • 方法定義骨架
  • 參數不必完全相同
  • 正式或非正式

$$

$$

先從非正式介面開始吧!

一個含三個抽象方法的 Python 介面示意圖。

Python 物件導向程式設計進階

以 duck typing 實作非正式介面

class Course:
    def assign_homework(self, assignment_number, due_date):
        # Typically, the pass keyword will be used when creating an interface
        pass  

    def grade_assignment(self, assignment_number):
        pass
  • Duck typing
  • assign_homework()grade_assignment() 抽象方法
Python 物件導向程式設計進階

以 duck typing 實作非正式介面

class ProgrammingCourse:
    def __init__(self, course_name):
        self.course_name = course_name

    def assign_homework(self, due_date):
        # Some implementation of assign_homework here...

    def grade_assignment(self, assignment_number):
        # Some implementation of grade_assignment here...
Python 物件導向程式設計進階

以 ABC、@abstractmethod 建立正式介面

from abc import ABC, abstractmethod

class Course(ABC):    
    @abstractmethod
    def assign_homework(self, assignment_number, due_date):
        pass

    @abstractmethod
    def grade_assignment(self, assignment_number):
        pass

正式介面與抽象基底類別有何不同?

Python 物件導向程式設計進階

介面 vs. 抽象基底類別

介面

  • 與實作類別訂下「契約」
  • 「必做事項」
  • 可分正式與非正式
  • 只含抽象方法(無具體方法)
  • 幾乎相同的類別

抽象基底類別

  • 為具共通特性的類別建立「藍圖」
  • 「是某種東西」關係
  • 通常僅有正式形式
  • 抽象與具體方法並存
  • 看起來、行為上相似的類別
Python 物件導向程式設計進階

實作正式介面

class ProgrammingCourse(Course):
    def __init__(self, course_name):
        self.course_name = course_name

    def assign_homework(self, due_date):
        # Some implementation of assign_homework here...

    def grade_assignment(self, assignment_number):
        # Some implementation of grade_assignment here...

intermediate_oop = ProgrammingCourse("Intermediate Object-Oriented Programming")
Python 物件導向程式設計進階

未完成正式介面實作的錯誤

class ProgrammingCourse(Course):
    def __init__(self, course_name):
        self.course_name = course_name

    def assign_homework(self, due_date):
        # Some implementation of assign_homework here...

intermediate_oop = ProgrammingCourse("Intermediate Object-Oriented Programming")
 ...
    intermediate_oop = ProgrammingCourse("Intermediate Object-Oriented Programming")
TypeError: Can't instantiate abstract class ProgrammingCourse with abstract method
    grade_assignment
Python 物件導向程式設計進階

一起來練習吧!

Python 物件導向程式設計進階

Preparing Video For Download...