Como usar classes abstratas em Python

Foto de Jr Korpa no Unsplash

O que é uma classe abstrata?

Uma classe abstrata é uma classe, mas não uma classe da qual você pode criar objetos diretamente. Sua finalidade é definir como outras classes devem se parecer, ou seja, quais métodos e propriedades elas devem ter.

Os métodos e propriedades definidos (mas não implementados) em uma classe abstrata são chamados de métodos abstratos e propriedades abstratas . Todos os métodos e propriedades abstratos precisam ser implementados em uma classe filha para poder criar objetos a partir dela.

Podemos criar uma classe abstrata herdando da ABCclasse que faz parte do abcmódulo .

from abc import (
  ABC,
  abstractmethod,
)

class BasicPokemon(ABC):
  def __init__(self, name):
    self.name = name
    self._level = 1
@abstractmethod
  def main_attack(self):
    ...

O que acontece se você tentar criar um objeto BasicPokemondiretamente? TypeError!

Tentando criar um novo objeto de uma classe abstrata e falhando porque main_attack não está implementado. Imagem do autor.

Agora, você notará que BasicPokemono __init__método de espera um nameargumento , portanto, o código acima não terá funcionado de qualquer maneira. A coisa a notar aqui é que ele nem vai para o __init__método para verificar isso. O fato de ter um método abstrato que não foi implementado tem precedência e falha por causa disso!

É assim que se usaria a BasicPokemonclasse.

from collections import namedtuple

Attack = namedtuple('Attack', ('name', 'damage'))

class Pikachu(BasicPokemon):
  def main_attack(self):
    return Attack('Thunder Shock', 5)

class Charmander(BasicPokemon):
  def main_attack(self):
    return Attack('Flame Thrower', 5)

Criando um novo Pikachu chamado … George. Imagem do autor.

Observe que você também pode criar propriedades abstratas usando o mesmo abstractmethoddecorador.

from abc import (
  ABC,
  abstractmethod,
)

class BasicPokemon(ABC):
  def __init__(self, name):
    self.name = name
  @property
  @abstractmethod
  def level(self):
    ...
  @abstractmethod
  def main_attack(self):
    ...

class Pikachu(BasicPokemon):
  @property
  def level(self):
    return 1
def main_attack(self):
    return Attack('Thunder Shock', 5)

Alguns de vocês podem estar se perguntando por que não poderíamos simplesmente usar uma classe normal (ou seja, não herdar de ABC) e gerar um NotImplementerErrorpara métodos que não foram implementados, como no exemplo abaixo.

class NotAbstractBasicPokemon:
  def __init__(self, name):
    self.name = name
    self._level = 1
def main_attack(self):
    raise NotImplementedError()

Criando um objeto de NotAbstractBasicPokemon e obtendo um erro ao tentar chamar main_attack(). Imagem do autor.

Por outro lado, tentar criar um objeto de BasicPokemonresulta em um erro imediatamente, como vimos anteriormente.

Quando devo usar uma classe abstrata?

No exemplo que estamos usando neste post, BasicPokemono propósito de 's era ser usado como um modelo para criar outras classes para tipos específicos de Pokémon. Existem alguns benefícios óbvios em ter uma classe abstrata da qual todos precisam herdar para criar um novo Pokémon:

  • Evite a duplicação de código.
  • Garanta a consistência em como outros implementam as subclasses.
  • Certifique-se de que ninguém se esqueça de implementar métodos e propriedades críticas em subclasses.

Conclusão

Neste post, vimos as classes abstratas do Python e como elas nos dão uma maneira de descrever como esperamos que as subclasses sejam implementadas e avisar os usuários (ou seja, outros programadores ou nossos futuros eus) quando partes críticas não são definidas.

  • Siga-me no Medium para atualizações.
  • Junte-se ao Medium com meu link de referência para acesso ilimitado às postagens. Sua taxa de adesão apoia diretamente a mim e aos escritores que você lê.

[1]https://docs.python.org/3/library/abc.html

[2]https://realpython.com/python-interface/

Mais do mesmo autor.

Calculando Usando Simulações de Monte-Carlo

Suggested posts

Encontrar informações sobre nomes de domínio

Um trecho de Small, Sharp Software Tools por Brian P. Hogan

Encontrar informações sobre nomes de domínio

Quando você faz uma solicitação para facebook.com, seu computador procura o nome de domínio para traduzir esse nome de domínio em um endereço IP para que seu computador possa fazer essa conexão.

Como executar plugins ChatGPT gratuitamente usando Langchain

Como executar plugins ChatGPT gratuitamente usando Langchain

Você deve ter ouvido falar sobre todos os novos plug-ins poderosos do ChatGPT, como navegador, intérprete de código, etc. Mas há um problema, o acesso aos plug-ins é limitado a uma lista de espera e, portanto, muitos não têm acesso a ela.

Related posts

A revolução no local de trabalho: os principais especialistas discutem o trabalho híbrido e remoto

A revolução no local de trabalho: os principais especialistas discutem o trabalho híbrido e remoto

No atual cenário de negócios em rápida evolução, o conceito de trabalho híbrido e remoto ganhou um impulso sem precedentes. À medida que as empresas continuam a se adaptar às mudanças nas necessidades e expectativas de seus funcionários, especialistas de várias áreas se reuniram para discutir os benefícios, os desafios e o futuro dessa forma transformadora de trabalhar.

A lenta erosão: revelando como as pessoas desperdiçam em suas carreiras

A lenta erosão: revelando como as pessoas desperdiçam em suas carreiras

No mundo acelerado e competitivo de hoje, a carreira desempenha um papel significativo no crescimento pessoal, na estabilidade financeira e na satisfação geral com a vida. No entanto, muitos indivíduos encontram-se presos em um ciclo implacável de estagnação e insatisfação, definhando gradualmente em suas vidas profissionais.

Journal Ouvert

Journal Ouvert

Diário aberto: uma foto por dia. Sempre fui fascinado por histórias.

A perseguição aos cristãos: o crime de ódio do qual não falamos

Esqueça a islamofobia: cristãos (e judeus) são as principais vítimas de crimes de ódio religioso.

A perseguição aos cristãos: o crime de ódio do qual não falamos

Qualquer mente racional sabe que os círculos políticos e midiáticos são dominados pela esquerda, até mesmo pela extrema esquerda, um estado de coisas que cria um desequilíbrio no discurso político. No campo da religião, esse desequilíbrio é bem visível: jornais e redes de esquerda não se apressam em defender a fé cristã.