• Conceitos de P.O.O

Clique sobre os tópicos listados abaixo para navegar até o conteúdo desejado.

  1. Interface e declaração
  2. Declarar métodos
  3. Herança de interface
  4. Implementar métodos
  5. Herança múltipla
  6. isinstanceof, issubclass, typing.protocol

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.

Características
  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

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

Exemplo 1
from abc import ABC, abstractmethod

class nome_interface:
      pass

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

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

Sintaxe
@abstractmethod
def nome_metodo1()
    pass

@abstractmethod
def nome_metodo2(<lista_parametros>)
    pass

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

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 em sua seção.

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.

Sintaxe
class nome_classe(nome_interface1, ... , 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. 12/09/2025 - revisão 2 - Ajustes: pontuais, target de links, sintaxes e objetivos'
  2. 19/09/2024 - revisão 1 - correção em: sintaxes de 'Interface', Ex. 4 e 5; ajustes gramaticais; outros ajustes
  3. 20/02/2024 - versão inicial