インターフェース

Python 中級オブジェクト指向プログラミング

Jake Roach

Data Engineer

インターフェース

抽象メソッドのみで構成され、実装クラスとの「契約」を作る特別なクラス

  • 抽象メソッドの定義が必須
  • メソッド定義の骨組み
  • パラメータは一致不要
  • 形式的または非形式的

$$

$$

まずは非形式的インターフェースから!

3つの抽象メソッドを持つPythonのインターフェース図。

Python 中級オブジェクト指向プログラミング

ダックタイピングによる非形式的インターフェース

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
  • ダックタイピング
  • assign_homework()grade_assignment() は抽象メソッド
Python 中級オブジェクト指向プログラミング

ダックタイピングによる非形式的インターフェース

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. 抽象基底クラス

インターフェース

  • 実装クラスとの「契約」を定義する
  • 「必ずやること」
  • 形式的/非形式的
  • 抽象メソッドのみ(具体メソッドなし)
  • ほぼ同一のクラスに適用

抽象基底クラス

  • 共通特徴をもつクラスの「設計図」を作る
  • 「〜である(is-a)」
  • 通常は形式的のみ
  • 抽象+具体メソッドの混在
  • 見た目や振る舞いが類似するクラス
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 中級オブジェクト指向プログラミング

Let's practice!

Python 中級オブジェクト指向プログラミング

Preparing Video For Download...