Interfejsy

Programowanie obiektowe w Pythonie – poziom średnio zaawansowany

Jake Roach

Data Engineer

Interfejsy

Specjalny rodzaj klasy złożonej wyłącznie z metod abstrakcyjnych, tworzącej kontrakt z klasami implementującymi interfejs

  • Muszą definiować metody abstrakcyjne
  • Szkielet definicji metod
  • Parametry nie muszą być zgodne
  • Formalne lub nieformalne

$$

$$

Zacznijmy od interfejsów nieformalnych!

Diagram interfejsu Pythona z trzema metodami abstrakcyjnymi.

Programowanie obiektowe w Pythonie – poziom średnio zaawansowany

Nieformalne interfejsy z 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() i grade_assignment() to metody abstrakcyjne
Programowanie obiektowe w Pythonie – poziom średnio zaawansowany

Nieformalne interfejsy z 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...
Programowanie obiektowe w Pythonie – poziom średnio zaawansowany

Formalne interfejsy z ABC i @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

Czym formalne interfejsy różnią się od abstrakcyjnych klas bazowych?

Programowanie obiektowe w Pythonie – poziom średnio zaawansowany

Interfejsy a abstrakcyjne klasy bazowe

Interfejsy

  • Definiują „kontrakt" z klasami, które je implementują
  • „Must-do"
  • Formalne i nieformalne
  • Zawierają tylko metody abstrakcyjne (bez konkretnych)
  • Prawie identyczne klasy

Abstrakcyjne klasy bazowe

  • Tworzą „szkielet" dla klas o wspólnych cechach
  • „Is-a"
  • Zazwyczaj tylko formalne
  • Mieszanka metod abstrakcyjnych i konkretnych
  • Klasy o podobnym wyglądzie i działaniu
Programowanie obiektowe w Pythonie – poziom średnio zaawansowany

Implementacja formalnego interfejsu

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")
Programowanie obiektowe w Pythonie – poziom średnio zaawansowany

Brak implementacji formalnego interfejsu

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
Programowanie obiektowe w Pythonie – poziom średnio zaawansowany

Czas na ćwiczenia!

Programowanie obiektowe w Pythonie – poziom średnio zaawansowany

Preparing Video For Download...