Abstração
Abstração significa “esconder” partes da implementação do objeto expondo apenas uma interface simples para seu uso. Pense por exemplo num forno de micro-ondas, você não precisa entender toda a complexidade de como os componentes internos trabalham para gerar as ondas e produzir calor, você quer apenas apertar um ou dois botões e ter uma refeição quente pra comer. Toda essa complexidade são detalhes de implementação, você não precisa conhecê-los.
Da mesma forma seu objeto deve ter uma interface simples e amigável, deixando suas partes complexas ou detalhes de implementação protegidos do mundo exterior. Assim mudanças feitas internamente no nível da implementação não irão afetar sua interface pública e aqueles que utilizarem o objeto.

Encapsulamento
Encapsulamento se refere à construção do objeto de modo a proteger o acesso direto a seus dados internos. Ao encapsularmos um objeto estamos agrupando propriedades e métodos que estão diretamente relacionados dentro de um mesmo objeto, permitindo que essas propriedades sejam acessadas apenas através de métodos públicos. Desta forma tratamos de questões importantes como segurança e confiabilidade do estado do objeto.

Herança
A Herança é uma forma de eliminar repetição de código onde, como o próprio nome sugere, um objeto pode herdar características (ou seja, propriedades e métodos) de outra classe, sem a necessidade de se reescrever essas mesmas características.
Para um exemplo prático, pense nos objetos clt
e estagiario
. O objeto clt poderia ter métodos exclusívos como calculo_de_13
e fgts
, mas ambos compartilhariam propriedades como salario
e data_de_inicio
, e métodos como receber_salario
ou calcular_ferias
e não faria sentido implementar essas mesmas propriedades e métodos em ambas as classes, mas sim inserir essas características em uma classe pai como por exemplo funcionario
.


Polimorfismo
Poli significa muitas e Morphos significa forma, então Polimorfismo significa muitas formas. Em POO Polimorfismo é caracterizado quando duas ou mais classes possuem métodos com o mesmo nome, mas podendo ter implementações diferentes. Assim, é possível utilizar qualquer objeto que implemente o mesmo método sem nos preocuparmos com o tipo do objeto. Na prática isso nos possibilita remover do nosso código diversos IF statements ou SWITCH cases.
No exemplo dado acima, utilizando polimorfismo podemos implementar o método calcular_ferias
em cada um dos objetos clt
e estagiario
, sendo que cada um desses métodos pode ter uma implementação diferente.

EXERCÍCIO

De acordo com a imagem acima, crie as seguintes classes:
- Animal
- Ovelha que herdará tudo da classe Animal.
- Cao que herdará tudo da classe Animal.
- Gato que herdará tudo da classe Animal.
- Cavalo que herdará tudo da classe Animal.
- Vaca que herdará tudo da classe Animal.
7. Em cada uma das classes herdadas de “Animal”, implemente um método “def falar(self):”, onde cada um dos animais irá imprimir uma mensagem diferente na tela: