Skip to content

Latest commit

 

History

History
77 lines (59 loc) · 1.99 KB

07-classes-abstratas-e-a-biblioteca-ABC.md

File metadata and controls

77 lines (59 loc) · 1.99 KB

Classes abstratas e a biblioteca ABC

São classes "modelo" para criação de classes. Não são uma classe em si.

Muito usado em arquitetura de software, para criar padrões ou interfaces, também chamados de API. Issotraz previsibilidade para o desenvolvimento de software.

Para implementá-la, utiliza-se a biblioteca abc (abstract base method).

from abc import ABC, abstractmethod

# A classe base dos pokemons
class BasePokemon(ABC):
    def __init__(self, nome):
        self.nome = nome
        self._nivel = 1
        self._experiencia = 0

    @abstractmethod
    def ataque_principal(self): # O uso de métodos abstratos torna a classe abstrata
        pass

    @abstractmethod
    def passar_de_nivel(self):
        pass

    @abstractmethod
    def evoluir(self):
        pass

    @property
    @abstractmethod
    def tipo(self):
        pass

Criar um objeto de uma classe abstrata gera um erro

# pokemon = BasePokemon('Pikachu', 'Elétrico')

class Pikachu(BasePokemon):
    def __init__(self, nome):
        super().__init__(nome)

    def ataque_principal(self):
        print(f'{self.nome} usou Choque de trovão!')
        self._experiencia += 2
        self.passar_de_nivel()

    def passar_de_nivel(self):
        # Passa de nível a cada 10 pontos de experiência
        if self._experiencia % 10 == 0:
            self._nivel += 1
            print(f'{self.nome} passou para o nível {self._nivel}!')
            self.evoluir()

    def evoluir(self):
        if self._nivel == 25:
            print('!!!! Evoluiu para Raichu !!!!')
            self.nome = 'Raichu'

    @property
    def tipo(self):
        return 'Elétrico'
    
    def ataque_secundario(self):
        print(f'{self.nome} usou Surra de Calda!')
        self._experiencia += 2
        self.passar_de_nivel()

pokemon = Pikachu('Pikachu')
print(pokemon.nome + ' é um pokemon do tipo ' + pokemon.tipo)
for _ in range(125):
    pokemon.ataque_principal()
    pokemon.ataque_secundario()