Interfaces

Programação Orientada a Objetos Intermediária em Python

Jake Roach

Data Engineer

Interfaces

Um tipo especial de classe composta apenas por métodos abstratos que cria um contrato com as classes que a implementam

  • Deve definir métodos abstratos
  • Esqueleto das definições de métodos
  • Parâmetros não precisam bater
  • Formais ou informais

$$

$$

Vamos começar com interfaces informais!

Um diagrama de uma interface Python com três métodos abstratos.

Programação Orientada a Objetos Intermediária em Python

Interfaces informais com 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
  • Métodos abstratos assign_homework() e grade_assignment()
Programação Orientada a Objetos Intermediária em Python

Interfaces informais com 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...
Programação Orientada a Objetos Intermediária em Python

Interfaces formais com 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

Como as interfaces formais diferem das classes base abstratas?

Programação Orientada a Objetos Intermediária em Python

Interfaces vs. Classes Base Abstratas

Interfaces

  • Definem um "contrato" com as classes que as implementam
  • "Obrigatório fazer"
  • Formais e informais
  • Contêm apenas métodos abstratos (sem métodos concretos)
  • Classes quase idênticas

Classes base abstratas

  • Criam um "modelo" para classes com características em comum
  • "É um(a)"
  • Normalmente apenas formais
  • Misturam métodos abstratos e concretos
  • Classes que parecem e funcionam de modo semelhante
Programação Orientada a Objetos Intermediária em Python

Implementando uma interface formal

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")
Programação Orientada a Objetos Intermediária em Python

Falha ao implementar uma interface formal

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
Programação Orientada a Objetos Intermediária em Python

Vamos praticar!

Programação Orientada a Objetos Intermediária em Python

Preparing Video For Download...