Gränssnitt

Objektorienterad programmering i Python – fortsättningskurs

Jake Roach

Data Engineer

Gränssnitt

En särskild typ av klass bestående av enbart abstrakta metoder som skapar ett kontrakt med de klasser som implementerar gränssnittet

  • Måste definiera abstrakta metoder
  • Skelett av metoddefinitioner
  • Parametrar behöver inte matcha
  • Formella eller informella

$$

$$

Låt oss börja med informella gränssnitt!

Ett diagram över ett Python-gränssnitt med tre abstrakta metoder.

Objektorienterad programmering i Python – fortsättningskurs

Informella gränssnitt med 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() och grade_assignment() är abstrakta metoder
Objektorienterad programmering i Python – fortsättningskurs

Informella gränssnitt med 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...
Objektorienterad programmering i Python – fortsättningskurs

Formella gränssnitt med ABC och @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

Hur skiljer sig formella gränssnitt från abstrakta basklasser?

Objektorienterad programmering i Python – fortsättningskurs

Gränssnitt vs. abstrakta basklasser

Gränssnitt

  • Definierar ett "kontrakt" med klasser som implementerar det
  • "Måste göra"
  • Formella och informella
  • Innehåller enbart abstrakta metoder (inga konkreta metoder)
  • Nästan identiska klasser

Abstrakta basklasser

  • Skapar en "ritning" för klasser med gemensamma egenskaper
  • "Är en"
  • Vanligtvis enbart formella
  • Blandning av abstrakta och konkreta metoder
  • Klasser som liknar varandra till utseende och beteende
Objektorienterad programmering i Python – fortsättningskurs

Implementera ett formellt gränssnitt

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")
Objektorienterad programmering i Python – fortsättningskurs

Misslyckas med att implementera ett formellt gränssnitt

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
Objektorienterad programmering i Python – fortsättningskurs

Nu kör vi en övning!

Objektorienterad programmering i Python – fortsättningskurs

Preparing Video For Download...