Інтерфейси

Середній рівень об'єктно-орієнтованого програмування в 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. абстрактні базові класи

Інтерфейси

  • Визначають «контракт» із класами, що їх реалізують
  • «Must-do»
  • Формальні й неформальні
  • Містять лише абстрактні методи (без конкретних)
  • Майже ідентичні класи

Абстрактні базові класи

  • Створюють «шаблон» для класів із спільними властивостями
  • «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

Давайте потренуємось!

Середній рівень об'єктно-орієнтованого програмування в Python

Preparing Video For Download...