Classes e objetos em Python
Classes e objetos em python

Classes e objetos em Python

Nesta aula exploraremos como podemos organizar melhor nosso código utilizando classes e objetos. 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.

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.


Para verificar mais detalhes sobre estes comportamento acesse este código no github: 

Acesse nosso tutorial no GitHub

Vinicius dos Santos

Apenas um apaixonado por Ciência da Computação e forma com que ela pode transformar vidas!

Deixe uma resposta