
Vamos tratar sobre conceitos muito importante da Programação Orientada a Objetos que todo programador Python DEVE dominar:
- Classes;
- Objetos;
- Encapsulamento
- Abstração
A Programação Orientada a Objetos (POO) é um paradigma de programação baseado no conceito de Classes e Objetos.
Classes podem conter dados e código:
- Dados na forma de campos (também chamamos de atributos ou propriedades); e
- Código, na forma de procedimentos (frequentemente conhecido como métodos).
Uma importante característica dos objetos é que seus próprios métodos podem acessar e frequentemente modificar seus campos de dados: objetos mantém uma referência para si mesmo, o atributo self
no Python.
Na POO, os programas são projetados a partir de objetos que interagem uns com os outros.
Esse paradigma se concentra nos objetos que os desenvolvedores desejam manipular, ao invés da lógica necessária para manipulá-los.
Essa abordagem de programação é adequada para programas grandes, complexos e ativamente atualizados ou mantidos.
Classes, Objetos, Métodos e Atributos
- As Classes são tipos de dados definidos pelo desenvolvedor que atuam como um modelo para objetos. Pra não esquecer mais: Classes são fôrmas de bolo e bolos são objetos

- Objetos são instâncias de uma Classe. Objetos podem modelar entidades do mundo real (Carro, Pessoa, Usuário) ou entidades abstratas (Temperatura, Umidade, Medição, Configuração).

- Métodos são funções definidas dentro de uma classe que descreve os comportamentos de um objeto. Em Python, o primeiro parâmetro dos métodos é sempre uma referência ao próprio objeto.

- Os Atributos são definidos na Classe e representam o estado de um objeto. Os objetos terão dados armazenados nos campos de atributos. Também existe o conceito de atributos de classe, mas veremos isso mais pra frente.

Princípios Básicos de POO
A programação orientada a objetos é baseada nos seguintes princípios:
Encapsulamento
Usamos esse princípio para juntar, ou encapsular, dados e comportamentos relacionados em entidades únicas, que chamamos de objetos.
Por exemplo, se quisermos modelar uma entidade do mundo real, por exemplo Computador.
Encapsular é agregar todos os atributos e comportamentos referentes à essa Entidade dentro de sua Classe.
Dessa forma, o mundo exterior não precisa saber como um Computador liga e desliga, ou como ele realiza cálculos matemáticos!
Basta instanciar um objeto da Classe Computador, e utilizá-lo!
O princípio do Encapsulamento também afirma que informações importantes devem ser contidas dentro do objeto de maneira privada e apenas informações selecionadas devem ser expostas publicamente.
Veja a imagem abaixo que exemplifica a relação entre atributos e métodos públicos e privados:

A implementação e o estado de cada objeto são mantidos de forma privada dentro da definição da Classe.
Outros objetos não têm acesso a esta classe ou autoridade para fazer alterações.
Eles só podem chamar uma lista de funções ou métodos públicos.
Essa característica de ocultação de dados fornece maior segurança ao programa e evita corrupção de dados não intencional.

Abstração
Pense em um Tocador de DVD.

Ele tem uma placa lógica bastante complexa com diversos circuitos, transistores, capacitores e etc do lado de dentro e apenas alguns botões do lado de fora.
Você apenas clica no botão de “Play” e não se importa com o que acontece lá dentro: o tocador apenas… Toca.
Ou seja, a complexidade foi “escondida” de você: isto é Abstração na prática!
O Tocador de DVD abstraiu toda a lógica de como tocar o DVD, expondo apenas botões de controle para o usuário.
O mesmo se aplica à Classes e Objetos: nós podemos esconder atributos e métodos do mundo exterior. E isso nos traz alguns benefícios!
Primeiro, a interface para utilização desses objetos é muito mais simples, basta saber quais “botões” utilizar.
Também reduz o que chamamos de “Impacto da mudança”, isto é: ao se alterar as propriedades internas da classes, nada será alterado no mundo exterior, já que a interface já foi definida e deve ser respeitada.
EXERCÍCIOS
- Defina o que é encapsulamento na POO.
- Na linguagem Python, como tornamos um atributo de uma classe privado?
QUESTIONÁRIO DE POO
link: https://portifolios.com/eeep/questionario/
Vídeo complementar: https://www.youtube.com/watch?v=EDshlnMJp-I