Интерфейсы

Объектно-ориентированное программирование на Python: средний уровень

Jake Roach

Data Engineer

Интерфейсы

Особый вид класса, состоящий только из абстрактных методов и задающий контракт с классами, которые его реализуют

  • Должен определять абстрактные методы
  • Каркас определений методов
  • Параметры не обязаны совпадать
  • Формальные или неформальные

$$

$$

Начнём с неформальных интерфейсов!

Диаграмма интерфейса 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. абстрактные базовые классы

Интерфейсы

  • Определяют «контракт» с классами, которые их реализуют
  • «Обязан делать»
  • Формальные и неформальные
  • Содержат только абстрактные методы (без конкретных)
  • Практически идентичные классы

Абстрактные базовые классы

  • Задают «шаблон» для классов с общими характеристиками
  • «Является»
  • Как правило, только формальные
  • Сочетание абстрактных и конкретных методов
  • Классы со схожей структурой и поведением
Объектно-ориентированное программирование на 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...