Nesta aula exploraremos como podemos organizar melhor nosso código utilizando classes e objetos em Python. A boa utilização deste recurso demanda bastante esforço de compreensão e é bastante interessante que você faça um curso correlato para se aperfeiçoar.
Esse artigo pertence a um sequência de conteúdos sobre programação em Python. Clique aqui para ver mais.
O que é uma classe?
Uma classe é uma estrutura que possui necessariamente atributos e métodos. Os atributos são “características” que definem um objeto. Por exemplo:
Uma pessoa, características possíveis: Nome, telefone, email, CPF, RG, corDoCabelo, sexo, …
Usando esta forma de abstração podemos criar modelagens que representam a interação entre objetos no mundo real. A orientação a objetos é essencialmente uma abstração do mundo real.
Outra possibilidade é definir os métodos da classe. Estes métodos são “ações” atribuídas ao objeto representado. Por exemplo:
Possíveis ações de uma pessoa: andar, falar, correr, gritar, comer, dormir, …
Dessa forma, os métodos definirão como certas ações são executadas por uma pessoa.
Objeto ou classe?
Uma classe quando é definida, permite que o programador defina quais características genéricas um objeto daquela classe terá. Por exemplo:
Exemplo 1:
Imagine que todas as pessoas possuem características e possibilidades de executar ações ações diferentes. Por exemplo, a maioria das pessoas possui nome, telefone, email, CPF… e também podem executar ações diferentes, por exemplo: andar, falar, comer.
Porém, quando usamos o conceito de “classe” nos referimos a definição genérica do que é uma pessoa. Quando usamos a palavra Objeto, nos referimos a uma pessoa específica. (nome: joão, email: joã[email protected]).
Exemplo 2:
Imagine uma receita de bolo, esta pode ser abstraída como uma “classe” que define como um bolo deve ser feito. Agora imagine o bolo já criado, esse é uma instância da classe, ou seja, um objeto.
Como utilizar as classes em python
Veja um exemplo simples de como criar uma classe “pessoa” em python:
## Definindo uma classe
class Pessoa:
def __init__(self,nome):
self.nome = nome
def anda(self):
print(self.nome + ': estou andando')
def fala(self):
print(self.nome + ': estou falando')
def marcarUmaReuniao(self):
print("eu sou uma pessoa comum, vamos conversar?")
## Instanciando uma pessoa e invocando seus métodos
pessoa = Pessoa('astolfo');
pessoa.anda();
pessoa.fala();
astolfo: estou andando astolfo: estou falando
Cada vez que desejamos mudar o valor de um atributo da classe pessoa devemos acessa-lo utilizando:
pessoa.nome = "SeuNome";
A seguir veremos de forma rápida como utilizar os 3 pilares básicos da orientação a objetos: Encapsulamento, polimorfismo e herança.
Herança
A herança é um recurso das linguagens de programação que permite o programador reutilizar código. Para que fique mais fácil de compreender esse conceito é comum a utilização da abstração da relação entre objetos.
Exemplo 1:
Imagine uma pessoa com todas as características de uma pessoa comum. Agora imagine que você terá que modelar uma classe que represente um gerente. Em essência, um gerente É UMA pessoa. Logo muitos atributos entre eles são compartilhados, por exemplo: nome, telefone, email, cpf, etc.
Para reutilizar estes atributos e comportamentos utilizamos herança, veja um exemplo codificado em python.
## Definindo uma classe filha
class Gerente(Pessoa):
def __init__(self,nome, salario):
super().__init__(nome)
self.salario = salario
self.dataDeNascimento = "dd/mm/yy"
self.corDosOlhos = "castanhos" #definindo atributos sem inicializando-os porém não colocando no construtor
self.__sexo = "masculino"
def darUmaOrdem(self):
print("eu sou o gerente, estou dando uma ordem")
def marcarUmaReuniao(self):
print("Eu sou o seu gerente, vamos conversar na minha sala em 10 minutos")
Perceba que logo na declaração da classe gerente existe uma referência a classe pessoa. Veja a seguir como instanciar esta classe:
g1 = Gerente("mario da silva",1000)
print(g1.nome)
print(g1.corDosOlhos)
mario da silva
castanhos
Encapsulamento
O encapsulamento é muito importante para isolar em cada classe as funções de um objeto. Este isolamento, quando bem feito, é responsável por manter um baixo nível de acoplamento entre as classes. Porém, diferente de outras linguagens como o Java ou C# que são orientadas a objetos o python não implementa o encapsulamento de forma convencional.
No python não existem modificadores de acesso como o private, public ou protected. Por default todos os atributos são públicos. Para mitigar os problemas de encapsulamento existe uma convenção entre os programadores que todos os atributos que apresentam o underscore (_) no início do nome da variável não deve ser alterado fora da classe sem a utilização de um método.
#alterando um atributo "privado"
g1.__sexo = "feminino"
print (g1.__sexo)
# Encapsulamento dentro do python é apenas uma convenção... os atributos são privados quando possuem o __,
# porém eles podem ser acessados.
feminino
Polimorfismo
O polimorfismo é um comportamento característico das linguagens orientadas a objeto que permite que um método possua o mesmo nome de outro e ter comportamentos diferentes dependendo de algumas características da classe de onde ele foi definido.
O polimorfismo mais comum utilizado dentro do python é o de sobrescrita. Uma classe que é filha de outra sempre irá executar os métodos nela definidos. Caso o método não seja definido, ela executará o método definido na classe pai.
Veja o exemplo na classe pessoa e gerente:
class Pessoa:
def __init__(self,nome):
self.nome = nome
def anda(self):
print(self.nome + ': estou andando')
def fala(self):
print(self.nome + ': estou falando')
def marcarUmaReuniao(self):
print("eu sou uma pessoa comum, vamos conversar?")
class Gerente(Pessoa):
def __init__(self,nome, salario):
super().__init__(nome)
self.salario = salario
self.dataDeNascimento = "dd/mm/yy"
self.corDosOlhos = "castanhos" #definindo atributos sem inicializando-os porém não colocando no construtor
self.__sexo = "masculino"
def darUmaOrdem(self):
print("eu sou o gerente, estou dando uma ordem")
def marcarUmaReuniao(self):
print("Eu sou o seu gerente, vamos conversar na minha sala em 10 minutos")
Perceba que dentro da classe Pessoa e Gerente existe um método chamado “marcarUmaReuniao”. Este método existe na classe pessoa, no entanto ele é sobrescrito na classe gerente. Sendo assim, se você instancia um gerente e chama este método, o comportamento executado será da classe filha.
Veja nosso repositório no github: