Os quatro pilares da Programação Orientada a Objetos são conceitos fundamentais que guiam o design de sistemas baseados em objetos.

class ContaBancaria:
    def __init__(self, saldo_inicial):
        self.__saldo = saldo_inicial # Atributo "privado" por convenção

    def depositar(self, valor):
        if valor > 0:
            self.__saldo += valor
            print(f"Depósito de R${valor:.2f} realizado. Novo saldo: R${self.__saldo:.2f}")
        else:
            print("O valor do depósito deve ser positivo.")

    def sacar(self, valor):
        if valor > 0 and self.__saldo >= valor:
            self.__saldo -= valor
            print(f"Saque de R${valor:.2f} realizado. Novo saldo: R${self.__saldo:.2f}")
        else:
            print("Saldo insuficiente ou valor de saque inválido.")

    def get_saldo(self): # Método público para acessar o saldo
        return self.__saldo

minha_conta = ContaBancaria(1000)
minha_conta.depositar(200) # Saída: Depósito de R$200.00 realizado. Novo saldo: R$1200.00
minha_conta.sacar(150)     # Saída: Saque de R$150.00 realizado. Novo saldo: R$1050.00
# print(minha_conta.__saldo) # Isso causaria um AttributeError (acesso direto ao "privado")
print(minha_conta.get_saldo()) # Saída: 1050.0
class Animal:
    def __init__(self, nome):
        self.nome = nome

    def comer(self):
        print(f"{self.nome} está comendo.")

class Cachorro(Animal): # Cachorro herda de Animal
    def __init__(self, nome, raca):
        super().__init__(nome) # Chama o construtor da classe pai
        self.raca = raca

    def latir(self):
        print(f"{self.nome} da raça {self.raca} está latindo: Au Au!")

meu_cachorro = Cachorro("Buddy", "Golden Retriever")
meu_cachorro.comer() # Saída: Buddy está comendo. (Método herdado)
meu_cachorro.latir() # Saída: Buddy da raça Golden Retriever está latindo: Au Au!