Pular para o conteúdo principal

Classes abstratas em Python: Um guia completo com exemplos

Aprenda sobre classes abstratas em Python, sua finalidade e como usar o módulo `abc` para garantir interfaces consistentes. Inclui exemplos práticos e melhores práticas para uma implementação eficaz.
Atualizado 8 de set. de 2025  · 10 min lido

Um componente essencial do desenvolvimento de software moderno é a programação orientada a objetos (OOP), que permite aos programadores organizar o código de forma escalável, modular e reutilizável. As classes abstratas são um dos vários conceitos da Programação Orientada a Objetos (OOP) que são essenciais para criar um modelo que outras classes possam usar. Este post vai explicar o que são classes abstratas, suas vantagens e como usar o módulo abc do Python para criá-las com sucesso.

Se você é novo no Python, pode aprender a trabalhar com módulos e pacotes, usar tipos de dados integrados e escrever funções personalizadas com nosso programa de habilidades. 

O que é uma classe abstrata?

Uma classe abstrata é tipo um modelo para outras classes. Ele define métodos que precisam estar em qualquer classe que herde dele, mas não dá o código real desses métodos.

Pense nisso como uma receita sem ingredientes específicoseladiz quais passos seguir, mas os detalhes dependem da subclasse.

Exemplo:

Digamos que você esteja criando um programa para calcular a área de diferentes formas.

  1. Você cria uma classe abstrata chamada Shape que diz que toda forma precisa ter um método area().
  2. Mas Shape não explica como funciona area() — porque a fórmula depende do tipo de forma.
  3. Cada forma específica (como Circle ou Rectangle) herda de Shape e oferece sua própria versão de area().

Se você quer saber mais sobre os principais conceitos do Python, pode se inscrever no nosso curso de Programação Orientada a Objetos em Python - Nível Intermediário

Por que usar classes abstratas em Python?

As classes abstratas são úteis quando você quer:

  • Implementar o método: Os métodos de uma classe abstrata funcionam como um contrato, exigindo que cada subclasse forneça sua própria implementação. Isso diminui a chance de implementações inconsistentes ou incompletas, garantindo que uma funcionalidade específica esteja presente em todas as classes derivadas.
  • Incentive a reutilização de código: as classes abstratas podem ter métodos concretos e abstratos. Os métodos concretos reduzem bastante a duplicação de código e incentivam os princípios DRY (Do not Repeat Yourself, ou Não se repita) ao fornecer funcionalidades compartilhadas que podem ser herdadas por todas as subclasses.
  • Melhorar a legibilidade e a manutenção: As classes abstratas ajudam os desenvolvedores a entender melhor a estrutura e a funcionalidade do software, oferecendo uma estrutura consistente e transparente. Essa estrutura facilita a manutenção do código, aplicando princípios de design como responsabilidade única e separação de responsabilidades.
  • Incentive o polimorfismo: As classes abstratas permitem escrever código geral que funciona bem com várias subclasses. Os desenvolvedores podem criar funções ou métodos que podem lidar com qualquer subclasse da classe abstrata graças a essa flexibilidade, o que aumenta a extensibilidade do código e a adaptabilidade a mudanças no futuro.

Você pode garantir que qualquer subclasse, como Dog ou Cat, implemente sua implementação do método speak, por exemplo, se você tiver uma classe abstrata Animal com um método abstrato speak. Seu código fica confiável e previsível por causa dessa uniformidade.

Aprenda Python do zero

Domine o Python para a ciência de dados e adquira habilidades que estão em alta.
Comece a aprender de graça

O módulo abc em Python

O módulo abc em Python oferece um suporte integrado robusto para classes abstratas. O módulo, que significa “Abstract Base Classes” (Classes Base Abstratas), dá aos programadores as ferramentas necessárias para criar classes abstratas, incluindo o decorador abstractmethod e a classe `ABC`. 

Ao definir métodos abstratos e exigir sua implementação em subclasses, essas ferramentas ajudam a manter a uniformidade e a conformidade com uma interface pré-determinada. Ao exigir a implementação de métodos essenciais em todas as classes derivadas e permitir a implementação parcial de funcionalidades comuns em classes base abstratas, o módulo também incentiva a melhoria dos padrões de design. 

Por isso, o módulo ABC é um componente essencial para organizar aplicativos Python escaláveis, robustos e estáveis.

Criando uma classe abstrata em Python

Dois componentes essenciais são apresentados no módulo ABC:

Classe Base Abstrata, ou ABC

A classe ABC é um recurso integrado do Python que serve como base fundamental para o desenvolvimento de classes abstratas. Você precisa herdar de ABC para definir uma classe abstrata. A classe é abstrata e não pode ser instanciada diretamente, como mostra essa herança. Ao servir como modelos, as classes abstratas garantem que qualquer subclasse concreta siga um conjunto de regras.

Você pode definir métodos abstratos dentro de uma classe abstrata usando o decorador abstractmethod. Qualquer subclasse concreta precisa implementar e substituir métodos abstratos, que são espaços reservados. Isso deixa o código consistente e previsível, garantindo que todas as classes derivadas ofereçam funcionalidade para os métodos designados. Uma ferramenta útil para exigir a implementação de métodos, ao mesmo tempo que dá flexibilidade às subclasses na forma como elas atendem a esses requisitos, é o decorador abstractmethod.

Aqui vai um exemplo básico:

from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        pass

    @abstractmethod
    def perimeter(self):
        pass

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14159 * self.radius ** 2

    def perimeter(self):
        return 2 * 3.14159 * self.radius

# Uncommenting the following line will raise an error because we’re missing method implementations
# shape = Shape() # TypeError: Can't instantiate abstract class Shape with abstract methods #area, perimeter

circle = Circle(5)
print(f"Area: {circle.area()}")
print(f"Perimeter: {circle.perimeter()}")

# Area: 78.53975
# Perimeter: 31.4159

Se você está procurando projetos Python mais práticos, dê uma olhada na nossa lista dos 60 melhores projetos Python para desenvolvedores de todos os níveis. 

Como o módulo abc faz a implementação do método

Qualquer subclasse de uma classe abstrata vai implementar os métodos decorados, graças ao decorador abstractmethod. Como precaução, impede que sejam criadas subclasses que não tenham as capacidades necessárias. 

O Python mostra um erro de TypeError quando tenta instanciar uma subclasse que não substitui todos os métodos abstratos. Essa aplicação rigorosa diminui a chance de erros e melhora a estabilidade do código, ajudando os desenvolvedores a identificar falhas de implementação logo no começo. 

Isso também garante que todas as subclasses concretas sigam o comportamento e o design pretendidos pela classe abstrata.

Por exemplo:

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    # Missing area and perimeter implementation

# This will raise an error
rectangle = Rectangle(5, 10)

# TypeError: Can't instantiate abstract class Rectangle with abstract methods area, perimeter

Métodos de classe abstrata em Python

Em Python, definir uma classe abstrata envolve usar o decorador abstractmethod e criar uma subclasse a partir de ABC. Ao fazer isso, os programadores podem preparar o terreno para outras classes, definindo os métodos que precisam ser usados. 

Aqui está um procedimento detalhado, passo a passo:

  • Inclua os módulos necessários: Importar ABC e abstractmethod do móduloABC deve vir primeiro. Para definir classes e métodos abstratos, essas ferramentas são necessárias.
  • Crie uma classe com base em ABC: Crie uma nova classe e defina ABC como seu herdeiro. A classe é abstrata e não pode ser instanciada diretamente, como mostra essa herança.
  • Defina métodos abstratos usando @abstractmethod: Para especificar quais métodos as subclasses devem substituir, use o decorador ` @abstractmethod `. Basicamente, esses métodos são como espaços reservados, garantindo que todas as classes derivadas façam as operações necessárias.

Exemplo passo a passo de como definir uma classe abstrata

Aqui vai um exemplo prático pra mostrar como funciona:

from abc import ABC, abstractmethod

class Vehicle(ABC):
    @abstractmethod
    def start_engine(self):
        pass

    @abstractmethod
    def stop_engine(self):
        pass

class Car(Vehicle):
    def start_engine(self):
        print("Car engine started")

    def stop_engine(self):
        print("Car engine stopped")

# Instantiating the abstract class directly will raise an error
# vehicle = Vehicle()

car = Car()
car.start_engine()
car.stop_engine()

# Car engine started
# Car engine stopped

Isso garante que as funções start_engine e stop_engine sejam implementadas por qualquer subclasse de `Vehicle`.

Exemplo prático: implementação de classe abstrata

Dá uma olhada numa ilustração mais detalhada usando uma classe Vehicle:

from abc import ABC, abstractmethod

class Vehicle(ABC):
    def __init__(self, brand):
        self.brand = brand

    @abstractmethod
    def start_engine(self):
        pass

    @abstractmethod
    def stop_engine(self):
        pass

class Motorcycle(Vehicle):
    def start_engine(self):
        print(f"{self.brand} motorcycle engine started")

    def stop_engine(self):
        print(f"{self.brand} motorcycle engine stopped")

motorcycle = Motorcycle("Yamaha")
motorcycle.start_engine()
motorcycle.stop_engine()
# Yamaha motorcycle engine started
# Yamaha motorcycle engine stopped

Isso mostra como as classes abstratas dão flexibilidade de implementação e, ao mesmo tempo, garantem uma interface consistente.

Exemplo de classe base abstrata em Python

Agora que vimos como as classes base abstratas definem um contrato para as subclasses, vamos ver como as classes concretas cumprem esses requisitos implementando todos os métodos abstratos.

Classe concreta herdada de uma classe abstrata

Uma subclasse que implementa todos os métodos abstratos de uma classe abstrata é chamada de classe concreta. Isso mostra que a classe concreta oferece implementações específicas para todos os métodos necessários, cumprindo assim o contrato estabelecido pela classe abstrata. 

Por exemplo:

from abc import ABC, abstractmethod

class Appliance(ABC):
    @abstractmethod
    def turn_on(self):
        pass

    @abstractmethod
    def turn_off(self):
        pass

class WashingMachine(Appliance):
    def turn_on(self):
        print("Washing machine is now ON")

    def turn_off(self):
        print("Washing machine is now OFF")

machine = WashingMachine()
machine.turn_on()
machine.turn_off()

# Washing machine is now ON
# Washing machine is now OFF

Criando instâncias e aplicando regras

Python não deixa você instanciar uma classe abstrata na hora. Isso é super importante nas classes abstratas, porque garante que qualquer subclasse gerada a partir da classe abstrata vai seguir o contrato necessário fornecido pelos seus métodos abstratos. 

Por exemplo, uma exceção TypeError vai ser lançada se você tentar instanciar appliance = Appliance()

Essa limitação garante que as classes abstratas funcionem apenas como modelos e não sejam usadas de forma errada. Python permite a criação de instâncias de WashingMachine, mantendo o contrato especificado em Appliance, implementando todos os métodos abstratos em WashingMachine. Garantindo que todos os recursos especificados na classe abstrata sejam totalmente implementados em suas subclasses concretas, essa aplicação melhora a integridade da base de código.

Propriedades abstratas e inicialização

Com essa base, vamos nos aprofundar em como o Python suporta propriedades abstratas usando os decoradores @property e @abstractmethod, permitindo que os desenvolvedores garantam a consistência dos atributos junto com os métodos.

Usando propriedades abstratas em Python

As classes abstratas podem especificar propriedades que as subclasses devem implementar, além dos métodos. Esse recurso permite que os desenvolvedores imponham uma interface uniforme para propriedades que as subclasses devem declarar além dos métodos. 

Pra garantir que cada subclasse tenha sua implementação, dá pra especificar propriedades abstratas usando o decorador @property junto com @abstractmethod. Quando você está criando classes que precisam de atributos somente leitura ou calculados que são essenciais para o funcionamento da classe, esse método é super útil.

Exemplo: classe abstrata com propriedades

Aqui vai um exemplo:

from abc import ABC, abstractmethod

class Animal(ABC):
    @property
    @abstractmethod
    def sound(self):
        pass

class Bird(Animal):
    @property
    def sound(self):
        return "Chirp"

bird = Bird()
print(bird.sound)

# Chirp

A condição da classe abstrata Animal é atendida pelo recurso sound da classe Bird.

Quando usar classes abstratas em Python

As classes abstratas são ideais para cenários como:

  • Ao projetar estruturas ou bibliotecas onde um comportamento específico precisa ser aplicado: Em sistemas complicados, as classes abstratas podem criar um conjunto unificado de diretrizes ou interfaces que todas as subclasses precisam seguir, garantindo consistência e reduzindo erros.
  • Implementando APIs consistentes entre classes: Os desenvolvedores podem garantir que todas as classes derivadas ofereçam um meio padronizado e previsível de comunicação com o aplicativo ou biblioteca, definindo métodos abstratos.
  • Fornecendo uma estrutura básica para uma hierarquia de classes: Uma hierarquia de classes relacionadas pode ser criada usando classes abstratas como guia. Ao permitir a personalização em subclasses e permitir que os desenvolvedores declarem comportamentos e características compartilhadas na classe abstrata, essa estrutura incentiva a reutilização e minimiza a duplicação.

Melhores práticas

Quando precisar criar um contrato preciso para subclasses, use classes abstratas. As classes abstratas são úteis quando você precisa aplicar uma estrutura ou comportamento específico a várias classes derivadas. Elas ajudam a garantir que todas as subclasses sigam um padrão de design, o que melhora a previsibilidade do código e facilita a manutenção.

Se cada método pode ter uma implementação padrão, não use classes abstratas. Em certas situações, uma classe base concreta pode ser uma opção melhor para reduzir a complexidade, mantendo a capacidade de reutilizar funcionalidades compartilhadas.

Certifique-se de que as classes abstratas sejam claras e simples, definindo apenas os atributos e métodos mais importantes. Pode ser complicado criar e manter uma classe abstrata se ela tiver muitos critérios. Em vez disso, concentre-se nos aspectos essenciais que as classes derivadas devem ter.

Conclusão

O kit de ferramentas OOP do Python inclui classes abstratas, que são uma ferramenta poderosa que permite aos programadores criar programas confiáveis e fáceis de manter. Você pode deixar suas aplicações mais claras, reutilizáveis e extensíveis definindo classes abstratas e aplicando uma interface uniforme nas subclasses com a ajuda do módulo ABC. É possível escrever um código melhor e mais confiável implementando classes abstratas, independentemente do tamanho do sistema em que você está trabalhando.

Se você está criando programas orientados a objetos robustos, implementando interfaces consistentes ou criando aplicativos escaláveis, dominar as classes abstratas do Python melhora sua capacidade de escrever código eficiente e fácil de manter. Melhore seus conhecimentos em Python hoje mesmo com nosso curso completo programa de habilidades Fundamentos do Python.

Perguntas frequentes sobre classes abstratas em Python

Como você define um método abstrato em Python?

Um método abstrato é definido usando o decorador ` @abstractmethod ` do módulo ` abc `. Ele serve como um espaço reservado e precisa ser substituído por qualquer subclasse.

Dá pra instanciar uma classe abstrata em Python?

Não, você não pode instanciar uma classe abstrata diretamente. O Python vai lançar uma exceção de tipo ( TypeError ) se você tentar criar um objeto de uma classe abstrata.

Qual é o objetivo do módulo `abc` em Python?

O módulo ` abc ` oferece a classe ` ABC ` e o decorador ` abstractmethod ` para definir e aplicar classes e métodos abstratos em Python.

Uma classe abstrata pode ter métodos regulares (concretos)?

Sim, uma classe abstrata pode ter métodos concretos com implementação. Esses métodos podem ser herdados e usados por subclasses.


Derrick Mwiti's photo
Author
Derrick Mwiti
Tópicos

Os melhores cursos de Python

Programa

Fundamentos de dados Python

0 min
Aumente suas habilidades com dados, descubra como manipular e visualizar dados e aplique análises avançadas para tomar decisões orientadas por dados.
Ver detalhesRight Arrow
Iniciar curso
Ver maisRight Arrow
Relacionado

Tutorial

Programação orientada a objetos em Python (OOP): Tutorial

Aborde os fundamentos da programação orientada a objetos (OOP) em Python: explore classes, objetos, métodos de instância, atributos e muito mais!
Théo Vanderheyden's photo

Théo Vanderheyden

Tutorial

Tutorial de docstrings em Python

Saiba mais sobre os Docstrings do Python. Encontre diferentes exemplos e tipos de formatos de docstrings para Sphinx, Numpy e Pydoc.
Aditya Sharma's photo

Aditya Sharma

Tutorial

Tutorial de Python

Em Python, tudo é objeto. Números, cadeias de caracteres (strings), DataFrames, e até mesmo funções são objetos. Especificamente, qualquer coisa que você usa no Python tem uma classe, um modelo associado por trás.
DataCamp Team's photo

DataCamp Team

Tutorial

Desenvolvimento de back-end em Python: Um guia completo para iniciantes

Este guia completo ensina a você os fundamentos do desenvolvimento de back-end em Python. Aprenda conceitos básicos, estruturas e práticas recomendadas para você começar a criar aplicativos da Web.
Oluseye Jeremiah's photo

Oluseye Jeremiah

Tutorial

30 truques legais do Python para melhorar seu código, com exemplos

A gente selecionou 30 truques legais de Python que você pode usar pra melhorar seu código e desenvolver suas habilidades em Python.
Kurtis Pykes 's photo

Kurtis Pykes

Ver maisVer mais