Programação orientada a objetos (POO) é uma ferramenta que permite a criação de códigos mais organizações. Também permite a criação de código que é reutilizável e escalável, o que é ideal para lidar com a complexidade e o volume de dados. Qualquer cientista de dados que deseja aprimorar suas habilidades e desenvolver projetos mais eficientes deve aprender POO. Por isso nesse post vamos introduzir esse método.

O conceito de POO é um pouco mais complicado e talvez levará algum tempo para entender bem essa técnica. Contudo, é uma maneira excelente de programar, pois tem uma flexibilidade maior e mais efetiva para solucionar problemas mais complexos.

Então, vamos lá aprender como fazer isso.

O que é Programação Orientada de Objetos?

A programação orientada de objetos é uma forma de programar, que organiza o código ao redor de objetos. Por isso chamado de POO.

Essa forma de programação simplifica problemas mais complexos, dividindo em unidades menores. Também ajuda a reusar todas essas formas sem ter que reescrever tudo que estávamos fazendo.

Para entender melhor, usaremos uma analogia que corresponde a esse caso.

Exemplos de Classes

Imagine que "Class" ou classe é um molde de biscoito e o objeto é o próprio biscoito. O molde descreve o formato e as regras do biscoito (tamanho, sabor, cobertura), mas não é um biscoito de verdade. Só quando o molde é usado que nasce o biscoito concreto.

Em POO, a classe é a descrição do que algo é, e como saber fazer. O objeto é a coisa em si, criada a partir dessa descrição.

Agora, pense em um carro. Todos os carros tem coisas em comum: marca, cor, número de portas, e todos ligam, aceleram e freiam. Isso é a classe Carro. O seu carro específico — um Gol vermelho — é um objeto dessa classe. Cada objeto guarda os seus próprios dados. Por exemplo, o seu Gol vermelho não muda de cor por causa do carro da vizinha.

Outra coisa envolvida com POO é herança. Digamos que a sua classe chama-se "Veículo", carros e motos pertencem a classe veículo. Pois ambos tem algo em comum, como rodas, motor e condições para movimentar. Carro e moto recebem os itens comuns e o resto pode construir por si mesmo.

Exemplos Práticos

Vamos criar uma conta bancária. A class (classe) é a Conta Bancária. Todas as contas estão nesse banco. Então esse é o nosso molde.

Imediatamente, quando criamos uma classe temos também que fazer o construtor, que no caso é init. O mais básico de uma conta bancária seria o nome do titular e o saldo. Então vamos iniciar isso:

class ContaBancaria:
    def __init__(self, titular, saldo_inicial=0):
        self.titular = titular
        self._saldo = saldo_inicial # atributo protegido

Uma coisa que ainda não falamos é sobre o sublinhado. Observe que o saldo tem _ na frente. Isso só está indicando que é um atributo interno e não deve ser usado pelo usuário.

O self.titular vai guardar o nome do titular da conta.

Criando uma Porta de Leitura

Vamos adicionar ao código:

class ContaBancaria:
    def __init__(self, titular, saldo_inicial=0):
        self.titular = titular
        self._saldo = saldo_inicial # atributo protegido
        
    @property
    def saldo(self):
        # Só leitura pública; evita mexer direto em _saldo
        return self._saldo

Observe que eu adicionei o @property que transforma esse método em um atributo somente para leitura. Assim podemos checar o saldo, mas não conseguiremos mudar. Por exemplo, podemos fazer conta.saldo e mostrará o saldo. Mas não conseguiremos fazer conta.saldo = 500.

Isso garante que qualquer mudança no saldo precisa passar por regras de segurança. Então, a próxima pergunta é: como mudar o saldo?

Modificando o Saldo

Agora já vou adicionar depósito e saque.

class ContaBancaria:
    def __init__(self, titular, saldo_inicial=0):
        self.titular = titular
        self._saldo = saldo_inicial # atributo protegido
        
    @property
    def saldo(self):
        # Só leitura pública; evita mexer direto em _saldo
        return self._saldo
    
    def depositar(self, valor):
        if valor > 0:
            self._saldo += valor
            
    def sacar(self, valor):
        if 0 < valor <= self._saldo:
            self._saldo -= valor
            return valor
        print("Saldo insuficiente ou valor inválido.")
        return 0

Com essa adição eu já estou colocando aqui para o Python só aceitar depósitos positivos, e só autorizar saques que evitem a conta ir ao negativo.

Como Usar Essa Classe

Vamos criar uma conta bancária, depositar dinheiro, buscar o saldo, e sacar algum dinheiro.

conta = ContaBancaria("Ana", 100)  # cria a conta com 100 de saldo

Vamos depositar mais dinheiro e checar o saldo.

conta.depositar(50)                # adiciona 50
print(conta.saldo)

Quando você imprime, poderá notar que o saldo mudou de 100 para 150.

Agora, vamos sacar dinheiro.

conta.sacar(100)
print(conta.saldo)

Observe que agora o saldo é 50. Vamos tentar sacar mais 100 para ver o que acontece.

conta.sacar(100)

Ai está o erro, e mostra que não sacou nada. Se checar o saldo novamente, verá que ainda tem 50.

Conclusão

Então, aprendemos hoje como usar POO. Podemos aplicar esse método para vários dos nossos códigos. Se é algo que fazemos repetidamente, poderemos reutilizar no futuro.

Se você não entendeu completamente como fazer isso, não se preocupe. Leva tempo para entender os detalhes. O ideal é você praticar. Quanto mais pratica, melhor ficará nisso.

No futuro trabalharemos bastante com isso.