A Chave para Aprender Desenvolvimento

Sempre é um desafio dar o primeiro passo na programação. Aqui no BioApps, recomendamos começar com Python.

Através dele, podemos compreender conceitos de Programação Orientada a Objetos. Essa base de conhecimento permite que você desenvolva códigos de maneira independente e aprenda até outras linguagens de programação de maneira mais eficiente.

🔧 Orientação a Objeto: Uma Abordagem Prática

O objetivo desse artigo não é que você entenda a fundo tudo sobre orientação a objeto, e sim que você tenha um ponto de partida sólido e consiga entender um código o suficiente para editar e adicionar novas funcionalidades ao final desta leitura.

Vamos pensar em projeto com aplicabilidade real na bioinformática: Imagine que você está pesquisando moléculas de naturezas diferentes e decide criar um código para caracterização molecular que te ajudaria a trabalhar com esses dados de forma mais organizada.

Precisamos de uma maneira de nomear nossas moléculas, este será nosso primeiro objetivo. Existem diversas características físico-químicas para escolhermos, nesse projeto inicial, vamos também trabalhar com polaridade. Com isso, estabelecemos um ponto de partida para criar nossa ferramenta.

Para agrupar informações correlacionáveis (nome e polaridade), criaremos nossa Classe: Molécula.

Assim como um gene serve de molde para codificar a mesma proteína mais de uma vez, classes são o molde para criamos vários objetos com a mesma “assinatura”. Essa abordagem permite trabalhar com centenas de moléculas sem precisar de escrever o mesmo código centenas de vezes.

Além de armazenar essas informações, é interessante que o usuário possa acessar essas informações. Para isso podemos criar a Função: Caracterizar em nossa molécula.

Quando encontramos a necessidade de armazenar um conjunto de comandos reutilizável (mostrar o nome e mostrar polaridade), usamos as funções.

Pensando em uma forma hierárquica, esta é a estrutura do projeto.

  • Criar uma Classe chamada Molécula – que seja capaz de:
    • Armazenar o nome;
    • Armazenar a polaridade;
    • Mostrar propriedades de moléculas ao usuário.

Não se preocupe muito em entender ou memorizar 100% da sintaxe agora, mas já temos alguns conceitos muito importantes para abordarmos aqui. Este é um exemplo de código que executa tudo que foi descrito.

Mesmo se você nunca viu sintaxe de Python, ou até mesmo se nunca escreveu uma linha de código anteriormente, ao ler esse código, tente formular uma ideia geral do que acontecerá aqui.

Não se preocupe em detalhes como “quando usar dois pontos ou não?“; “onde usar parênteses ou aspas?“.
Seu foco é racionalizar o código de forma intuitiva, como um bloco de instruções.

class Molecula:
    def __init__(self, nome, polaridade):
        self.nome = nome
        self.polaridade = polaridade

    def caracterizar(self):
        print("Nome: " + self.nome)
        print("Polaridade: " + self.polaridade)


agua = Molecula(nome="Água", polaridade="Polar")
benzeno = Molecula(nome="Benzeno", polaridade="Apolar")

agua.caracterizar()
benzeno.caracterizar()

🎯 Entendendo o Código

Primeiramente, para criar uma Classe em Python sempre usamos class (com todas as letras minúsculas) seguido de um espaço e o nome da Classe.

Para criar o uma Função sempre usamos def (também com todas as letras minúsculas) seguido de um espaço e nome da Função.

Existe uma função muito importante que existe para qualquer classe, a função __init__().

Esse é um nome especial para indicar para o Python que sempre que um objeto dessa classe é criado, vamos criar simultaneamente, variáveis com nomes específicos para armazenar informações importantes.

É importante esclarecer que os nomes e quantidades dessas variáveis são personalizáveis, e são definidos por quem cria o código. Podemos adicionar novas propriedades aqui como massa molecular, ponto de fusão, dentre outros, seguindo o mesmo padrão.

Criamos em nosso código a água (objeto da classe “Molecula”) e o benzeno (outro objeto da classe “Molecula”). Elas tem propriedades muito distintas.

🧐 Como o computador diferencia a água e o benzeno se ambos são da Classe Molécula?

O self existe justamente para isso. Self em inglês significa “próprio”. Então ao usar self.nome, estamos dizendo que cada Objeto terá um nome próprio, assim como usar self.polaridade significa que cada objeto terá uma polaridade própria.

agua = Molecula(nome="Água", polaridade="Polar")
benzeno = Molecula(nome="Benzeno", polaridade="Apolar")

Note que no __init__() definimos que o self.nome equivale ao “nome” e a self.polaridade equivale a “polaridade”, que são valores distintos que informamos ao criar nossos objetos.

Se você não entender 100% desse conceito, não se preocupe. Esse estilo de sintaxe começa a fazer mais sentido quando adquirimos mais familiaridade com conceitos mais avançados de orientação a objeto. Uma abordagem recomendada no começo é adotar isso como uma regra padrão:

Toda variável criada como o __init__(), vai deve ser combinada com o “self” de mesmo nome.

Ao final desse artigo temos um exemplo de implementação de uma nova propriedade para ilustrar isto de forma mais prática.

Entendendo a Funcionalidade de Caracterizar

Além de armazenar informações próprias (nome e polaridade), ambos objetos podem executar a outra funcionalidade que a “Molecula” armazena, nesse caso caracterizar().

agua.caracterizar()
benzeno.caracterizar()

Vamos entender um pouco melhor o que está acontecendo dentro desta função. Isso vai esclarecer a utilidade do self.nome e da self.polaridade.

class Molecula:
    def __init__(self, nome, polaridade):
        self.nome = nome
        self.polaridade = polaridade

    def caracterizar(self):
        print("Nome: " + self.nome)
        print("Polaridade: " + self.polaridade)

Eles são armazenados e podem ser utilizados em outros lugares da classe. O uso principal é em funções diferentes do init().

Um exemplo prático seria ter uma função capaz de gerar uma planilha com o resultado de análises físico-químicas de nossas moléculas de interesse. Neste contexto, podemos usar o self.nome na hora de salvar esse arquivo, assim cada molécula teria arquivos separados.

Para que as funções acessem “valores do self”, colocamos essa palavrinha entre parênteses depois de nomear nossa função. Lembrando que ela sempre precisa ser a primeira na ordem.

Depois podemos usar o print(), uma função do Python que escreve valores na tela, para escrever o nome e a polaridade.

Implementando Novas Funcionalidades

Vou mostrar como implementar uma nova funcionalidade em nossa aplicação, armazenar massa molecular.

class Molecula:
    def __init__(self, nome, polaridade, massa_molecular):
        self.nome = nome
        self.polaridade = polaridade
        self.massa_molecular = massa_molecular

    def caracterizar(self):
        print("Nome: " + self.nome)
        print("Polaridade: " + self.polaridade)
        print("Massa molecular" + self.massa_molecular)

agua = Molecula(nome="Água", polaridade="Polar", massa_molecular="18 g/mol")
benzeno = Molecula(nome="Benzeno", polaridade="Apolar", massa_molecular="78 g/mol")

agua.caracterizar()
benzeno.caracterizar()

Com apenas três alterações, foi possível implementar uma nova funcionalidade na lógica de nossa classe, e claro, atualizar nossas variáveis para que elas tragam essas informações.

Agora é com você! Tente realizar as seguintes alterações no código.

  • Crie uma molécula de glicose (polar, massa molecular de 180 g/mol).
  • Crie uma molécula de colesterol (apolar, massa molecular de 386 g/mol).
  • Implemente uma nova funcionalidade para armazenar de ponto de fusão para suas moléculas.

Em postagens futuras, teremos um detalhamento maior sobre variáveis, funções e mais exemplos práticos.

Fique por dentro das novidades acompanhando nosso blog para os próximos capítulos, e fique a vontade para comentar dúvidas ou compartilhar seu entendimento.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *