Programação orientada a objetos - Parte 2#
Introdução a POO#
As classes são uma forma poderosa de organizar e estruturar nosso código, permitindo a criação de objetos personalizados com propriedades e comportamentos próprios.
As classes podem ser definidas como modelos para a criação de objetos.
Elas contêm atributos (variáveis) e métodos (funções) que definem o comportamento do objeto criado a partir da classe.
Ao criar uma classe, estamos criando um tipo de dado personalizado e reutilizável em nosso código.
A utilização de classes é extremamente importante na programação orientada a objetos, pois permite a abstração de problemas complexos em entidades menores, além de facilitar a manutenção e reutilização do código.
Definindo uma Classe#
No Python, podemos definir uma classe utilizando a palavra-chave class, seguida pelo nome da classe.
O nome da classe deve seguir algumas convenções, como começar com uma letra maiúscula e utilizar a notação CamelCase (iniciais das palavras compostas são maiúsculas e não há espaços ou underscores).
Aqui está um exemplo simples de uma classe chamada Pessoa:
class Pessoa:
pass
Neste exemplo, utilizamos a palavra-chave pass para indicar que a definição da classe está vazia.
Isso permite que possamos criar a classe sem implementar nenhum atributo ou método por enquanto.
Criando um Objeto#
Uma vez definida a classe, podemos criar objetos a partir dela.
Esses objetos são chamados de instâncias da classe.
Para criar uma instância, utilizamos o nome da classe seguido de parênteses:
pessoa1 = Pessoa()
No exemplo acima, criamos uma instância da classe Pessoa e a atribuímos à variável pessoa1.
Agora, podemos acessar essa instância e manipulá-la.
Atributos da Classe#
A classes podem ter atributos, que são variáveis que pertencem à classe e são compartilhadas por todas as instâncias criadas a partir dessa classe.
Os atributos representam as características que o objeto da classe possui.
Podemos adicionar um atributo à classe Pessoa da seguinte forma:
class Pessoa:
nome = "João"
idade = 30
No exemplo acima, adicionamos os atributos nome e idade à classe Pessoa.
Agora, todas as instâncias dessa classe terão esses atributos definidos.
Podemos acessar e modificar os atributos de uma instância da seguinte forma:
pessoa1 = Pessoa()
print(pessoa1.nome)
pessoa1.nome = "Maria"
print(pessoa1.nome)
No exemplo acima, acessamos o atributo nome da instância pessoa1 e o modificamos para “Maria”.
Podemos fazer o mesmo com o atributo idade.
Métodos da Classe#
Além de atributos, as classes também podem ter métodos, que são funções que pertencem à classe e podem ser chamadas pelas instâncias dessa classe.
Os métodos representam os comportamentos que o objeto da classe pode realizar.
Podemos adicionar um método à classe Pessoa da seguinte forma:
class Pessoa:
def falar(self, mensagem):
print(f"{self.nome} diz: {mensagem}")
No exemplo acima, adicionamos o método falar à classe Pessoa.
O método recebe dois parâmetros: self e mensagem.
O parâmetro self é uma referência à própria instância da classe, permitindo o acesso aos atributos e métodos dessa instância.
Podemos chamar o método falar da seguinte forma:
pessoa1 = Pessoa()
pessoa1.nome = "João"
pessoa1.falar("Olá!")
No exemplo acima, chamamos o método falar da instância pessoa1, passando a mensagem “Olá!” como parâmetro.
Construtor da Classe#
O construtor é um método especial que é executado automaticamente quando uma instância da classe é criada.
No Python, o construtor é chamado de init.
Podemos utilizar o construtor para definir valores iniciais para os atributos da classe.
Aqui está um exemplo de como definir um construtor na classe Pessoa:
class Pessoa:
def __init__(self, nome, idade):
self.nome = nome
self.idade = idade
def falar(self, mensagem):
print(f"{self.nome} diz: {mensagem}")
No exemplo acima, definimos o construtor init com os parâmetros nome e idade.
Dentro do construtor, atribuímos os valores desses parâmetros aos atributos da classe Pessoa.
Podemos criar uma instância da classe Pessoa e passar os valores para o construtor da seguinte forma:
pessoa1 = Pessoa("João", 30)
print(pessoa1.nome)
print(pessoa1.idade)
João
30
No exemplo acima, criamos uma instância da classe Pessoa com o nome “João” e idade 30.
Ao imprimir os valores dos atributos nome e idade, obtemos os valores passados no construtor.
Herança de Classes Uma vantagem das classes é a possibilidade de criar novas classes a partir de classes existentes. Isso é chamado de Herança.
A classe derivada herda todos os atributos e métodos da classe base.
Aqui está um exemplo de como criar uma classe derivada (também chamada de subclasse) a partir da classe Pessoa:
class Estudante(Pessoa):
def __init__(self, nome, idade, matricula):
super().__init__(nome, idade)
self.matricula = matricula
No exemplo acima, criamos a classe Estudante que herda da classe Pessoa.
Utilizamos o método super().init() para chamar o construtor da classe Pessoa e passar os valores para os atributos nome e idade.
Podemos criar uma instância da classe Estudante e acessar os atributos e métodos da classe base da seguinte forma:
estudante1 = Estudante("Maria", 18, "12345")
print(estudante1.nome)
print(estudante1.idade)
print(estudante1.matricula)
estudante1.falar("Olá!")
Maria
18
12345
Maria diz: Olá!
No exemplo acima, criamos uma instância da classe Estudante com o nome “Maria”, idade 18 e matrícula “12345”.
Ao imprimir os valores dos atributos e ao chamar o método falar, temos acesso aos atributos e métodos da classe base Pessoa.