• Conceitos de P.O.O

As interfaces são um tipo de dado abstrato para especificarmos um contrato que uma classe deve seguir. Assim, conseguimos aplicar o conceito de abstração como parte da programação O.O. As características de interfaces estão listadas abaixo:

As características de interfaces estão listadas abaixo:

Características de um interface
  1. Não possuem implementação, tendo a implementação feita pela classe que herda
  2. Possuem apenas os protótipos de métodos
  3. Não possuem construtor
  4. Não podem ser instanciadas
  5. Permitem utilizar herança múltipla

Para auxiliar na utilização de interfaces em Python, precisamos importar os módulos ABC e abstracmethod:

Sintaxe
from abc import ABC,abstractmethod

class interface:
      pass

Diferente de linguagens como C# e Java, Python não possui uma palavra reservada interface para declaração de interfaces.

O corpo de uma interface deve conter apenas os protótipos/assinatura ou métodos abstrados que deverão utilizados como contrato.

Os métodos abstratos são "marcados" utilizando a anotação @abstractmethod como pode ser observados nos métodos contidos na sintaxe abaixo.

O uso do comando pass nos métodos abstratos é obrigatório, pois esses métodos não possuem implementação.

Sintaxe
@abstractmethod
def nome_metodo1()
        pass

@abstractmethod
def nome_metodo2(parametros)
        pass

@abstractmethod
def nome_metodoN(parametros)
        pass
Exemplo 2
from abc import ABC,abstractmethod

class interface:
    @abstractmethod
    def metodo1(p):
        pass
    
    @abstractmethod
    def metodo2(p,q):
        pass
Saída
-

Os métodos que não possuem implementação são chamados de métodos abstratos. Esses também são usados em classe abstrata que será vista mais adiante.

Para que seja possível o uso de uma interface, precisamos criar uma classe e informar que um determinada interface será herdada. Isso é feito com o uso da herança de classe já visto.

Sintaxe
class nome_classe(nome_interface)
    #corpo
Exemplo 3
from abc import ABC,abstractmethod

class interface:
    @abstractmethod
    def metodo1(p):
        pass
    
    @abstractmethod
    def metodo2(p,q):
        pass

class classe(interface) #herança de interface
    pass

Saída
-

A implementação dos métodos de uma interface é feita normalmente com qualquer outro métodos já exemplificado.

Os nomes dos parâmetros utilizados pelos métodos implementados não precisam necessariamente coincidir com os nomes declarados na assinatura dos métodos de uma interface.

Exemplo 4
from abc import ABC,abstractmethod

class interface:
    @abstractmethod
    def metodo1(p):
        pass
    
class classe(interface):
    def metodo1(self,p): #método concreto
        print(p)

obj1 = classe()
obj1.metodo1(1)
Saída
1

Com o uso de interface, podemos ter N classes herdando de uma mesma interface realizando as mesmas tarefas de forma diferente de acordo com suas necessidades.

Exemplo 5
from abc import ABC,abstractmethod

class interface:
    @abstractmethod
    def metodo1(p):
        pass
    
class classe1(interface):
    def metodo1(self,p):
        print(p)

class classe2(interface):
    def metodo1(self,p):
        print(p*p)

obj1 = classe1()
obj1.metodo1(1)

obj2 = classe2()
obj1.metodo1(2)
Saída
1
4

Para que seja possível o uso de múltiplas interface, precisamos criar uma classe e informar quais interfaces serão utilizadas. Para isso, devemos separa as interfaces herdadas por (,) no momento da declaração. Abaixo é mostrado o que foi discutido:

Sintaxe
class nome_classe(nome_interface1, nome_interface2, nome_interfaceN)
    #corpo
Exemplo 6
from abc import ABC,abstractmethod

class interface1:
    @abstractmethod
    def metodo1(p):
        pass
    
class interface2:
    @abstractmethod
    def metodo2(p):
        pass

class classe2(interface1,interface2):
    def metodo1(self,p):
        print(p)
        
    def metodo2(self,p):
        print(p*p)


obj = classe2()
obj.metodo1(1)
obj.metodo2(2)
Saída
1
4

A linguagem Python permite também que a herança múltipla seja mista. Podemos utilizar a herança de interface em conjunto com uma classe concreta.

Exemplo 7
from abc import ABC,abstractmethod

class interface:
    @abstractmethod
    def metodo1(p):
        pass
    
class classe:
    def metodo2(self,p):
        print(p)

class classe2(interface,classe):
    def metodo1(self,p):
        print(p)
        
obj = classe2()
obj.metodo1(1)
obj.metodo2(2)
Saída
1
2
  1. 19/09/2024 - revisão 1 - correção em: sintaxes de 'Interface', Ex. 4 e 5; ajustes gramaticais; outros ajustes
  2. 20/02/2024 - versão inicial