Article image
Silas Silva
Silas Silva11/05/2024 23:00
Compartilhe

Herança e Polimorfismo em Python: Aprenda a Estruturar suas Hierarquias de Classes

    E aí galera, alguém aí já ouviu falar de herança e polimorfismo? Bora conversar sobre isso pra vocês não ficarem tão assustados quanto eu quando ouvi a primeira vez essa frase 😅

       

    🏛️ Herança em Python 🏛️:

            Você já ouviu falar sobre herança? É como quando você herda coisas de seus pais, como olhos azuis ou cabelos cacheados. Em Python, é parecido.

            Imagine que você tem uma classe chamada "Animal" que tem algumas características, como "comer" e "dormir". Agora, se você quiser fazer uma classe específica para um "Cachorro", você pode dizer que ela é uma espécie de "Animal" e, portanto, herda as características básicas de um "Animal". Isso é herança!

            🎭 Polimorfismo em Python 🎭:

            Polimorfismo é como uma palavra grande para algo bem simples. É quando diferentes coisas podem ser tratadas da mesma forma.

            Por exemplo, se você tem uma função que espera um "Animal", você pode passar um "Cachorro" ou um "Gato" para ela. Porque, afinal, ambos são tipos de "Animal". Isso é polimorfismo em ação!

    🔎 Vamos analisar um código simples de Hierarquia de Classes, porém bem estruturado 🔎:

      class Personagem: #Definimos a classe Personagem
          def __init__(self, nome, vida): #metodo construtor __init__ e atribuímos os    parametros nome e vida
              self.nome = nome
              self.vida = vida
    
      class Heroi(Personagem):  # Herói herda de Personagem
          def __init__(self, nome, vida, habilidade):
              super().__init__(nome, vida)  # Chamando o construtor da classe mãe
              self.habilidade = habilidade
    
      heroi1 = Heroi("Superman", 100, "Voo")  # Criando um herói
      print(heroi1.nome)  # Saída: Superman
      print(heroi1.vida)  # Saída: 100
      print(heroi1.habilidade)  # Saída: Voo
    
    

    ⚠️ Pontos de atenção e dicas ⚠️:

    • Sempre deixe muito bem identificado como as classes se relacionam, ela é como um molde de criação. Caso a relação dela com outras classes seja confusa, seu código será de difícil manutenção. No exemplo do código sabemos que a classe mãe é personagem e dentro dela temos herói e poderemos ter tranquilamente vilão.
    • Use heranças para passar atributos de uma classe a outra e evitando a repetição de código
    • Sempre que precisar alterar uma classe para adicionar atributos a classe filha, use o método super(). Esse método irá garantir que será alterado apenas a classe filha, mantendo a classe mãe intacta.

    🤹‍♂️ Polimorfismo em ação 🤹‍♂️:

    Com base no código anterior, iremos analisar o Polimorfismo. Para isso iremos adicionar as classes vilão e atacar, observe abaixo:

          class Personagem: 
      def __init__(self, nome, vida): 
          self.nome = nome
          self.vida = vida
    
    
      class Heroi(Personagem):  
          def __init__(self, nome, vida, habilidade):
              super().__init__(nome, vida)
              self.habilidade = habilidade
    
    
      class Vilao(Personagem):  # Adicionando a classe Vilão
          def __init__(self, nome, vida, poder):
              super().__init__(nome, vida)
              self.poder = poder
    
    
      def atacar(personagem):  # Função para atacar, pode ser chamada por heróis ou vilões
          print(f"{personagem.nome} está atacando!")
    
    
      heroi1 = Heroi("Superman", 100, "Voo")  
      vilao1 = Vilao("Lex Luthor", 80, "Inteligência")
    
    
      atacar(heroi1)  # Chamando a função atacar() com um herói
      atacar(vilao1)  # Chamando a função atacar() com um vilão
    

    Observe que a função atacar pode ser chamada com qualquer objeto que tenha um atributo nome como Herói ou vilão, mesmo eles sendo diferentes

    Podemos tratar ele da mesma maneira nessa função. Esse é o Poliformismo que estávamos procurando.

    ⚠️ Pontos de atenção e dicas ⚠️:

    • Usando de Interfaces ou Métodos Comuns, garantimos a consistência na forma que diferentes objetos podem ser tratados entre classes que irão utilizar
    • O princípio de aberto/fechado nos diz que o código deve estar aberto para adição e fechado para manutenção. Ou seja, o fato de adicionar novas classes não irá modificar o código existente
    • Sempre documente de forma clara quais classes e métodos suportam polimorfismo e quais são os comportamentos esperados.

    🎉 Conclusão 🎉:

    Nesse artigo vimos como pode ser útil utilizar as Heranças e Poliformismo juntamente com exemplos práticos e boas práticas para sua

    utilização, elas funcionam de forma simples e são muito poderosas, então utilize-as sempre que forem necessárias.

    🙏 Agradecimentos 🙏:

    Se você gostou desse artigo, me adiciona no meu LinkedIn, garanto que não vai se arrepender.

    Ilustrações de arte geradas por lexica.art

    Gerado com auxílio do ChatGPT e revisado por alguém 100% humano (até onde eu sei) 😄

    Compartilhe
    Comentários (0)