Dez dicas sobre Python para programadores Java

  1. Python não suporta a instrução switch. A solução mais trivial para obter o mesmo comportamento seria usar if else encadeado. Mas a solução mais pythonica (se é que o termo existe) é usar dicionários para isso, aproveitando o fato que a implementação desta estrutura de dados é extremamente eficiente e que funções são first-class objects.

Exemplo:

def funcA() def funcB(): switch = {1: funcA, 2:funcB} switchvalor

  1. Em Python, tudo é objeto, desde os tipos primitivos int, boolean até o arquivo onde o código é gravado (chamado de módulo), passando por funções.

  2. A cultura Java diz que o acesso a atributos de um objeto deve ser feito por meio de métodos getters e setters. Portanto, quando um programador Java escreve em Python, a tendência é criar estes métodos. A cultura Python define que o acesso aos atributos se faz através da chamada direta ao atributo. Por exemplo, se tenho o objeto meuObjeto, que possui o atributo meuAtributo, então o acesso se faz via meuObjeto.meuAtributo. Este padrão pode parecer estranho à primeira vista, pois estaria quebrando alguns paradigmas de programação orientada a objeto permitindo acesso direto à variável. E se eu quiser fazer validações antes de definir o valor do atributo? Está tudo previsto! Python por trás dos panos chama os métodos get<atributo> e set<atributo>. O comportamento padrão é simplesmente obter ou gravar o valor do atributo. Mas caso o desenvolvedor deseje determinar um comportamento específico, basta sobreescrever o método.

  3. Variáveis e métodos privados em Python são definidos com dois _ antes do nome. Porém, eles não estarão completamente inacessíveis de fora. Simplesmente, o nome dele será concatenado com o nome da classe (name mangling) para dificultar o acesso. A idéia geral por trás disso é que ao definir um método ou atributo como privado, o desenvolvedor sinaliza que o uso da variável diretamente pode causar efeitos indesejáveis. Aquele que o fizer estará fazendo por sua conta e risco!

  4. Métodos estáticos em Java são no fundo uma forma de contornar o fato que a linguagem exige que todos os métodos tem que estar em uma classe. É um recurso muito utilizado para se criar coleções de funções utilitárias genéricas (como a classe Collections). Em Python, o equivalente pode ser feito por meio de funções definidas no módulo, fora de um objeto.

  5. Python suporta programação orientada a objetos, procedimental e funcional! Use e abuse desta liberdade.

  6. Dicionários são extremamente eficientes e muito simples se operar em Python. Se estiver pensando em criar uma classe apenas para transportar dados, pense duas vezes se usar um dicionário não é a melhor solução.

  7. Existem duas formas de se criar atributos de uma instância de um objeto em Python: ou dentro do método init, utilizando self.minhavariável, ou em qualquer ponto do código após a criação. Em Python, os atributos e variáveis são criados no momento do primeiro uso. Por exemplo: class MinhaClass: pass

instancia = MinhaClass() instancia.variavel=1

O código acima cria uma classe MinhaClasse, uma instância desta classe e adiciona um atributo variável. Atributos criados dentro do código da classe e fora do método init são equivalentes a variáveis estáticas em Java.

  1. Variáveis e atributos tem escopo de módulo, classe, método ou função, mas não tem escopo de bloco. Isso significa que uma variável criada dentro de um if continuará viva fora dele. Cuidado!

  2. A questão de uso de indentação para delimitação de blocos pode parecer estranho à primeira vista. Mas não é. Basta usar um editor decente, como PyDev para Eclipse ou python-mode para Emacs. O efeito colateral é que o código fica naturalmente organizado e fácil de ler.

  • Obrigado pela correção. Já troquei o termo procedural do texto por procedimental. E obrigado pelo comentário: elogios e críticas construticas são sempre muito bem vindas.

    []s
  • Muito bom artigo!

    Já tinha lido antes, mas não comentado. Fica aqui então minha mensagem: meus parabéns!

    Ah! Antes que me esqueça... o Bruno está certo: o correto é procedimental.

    []'s
  • Miguel Galves
    Obrigado pela corre&ccedil;&atilde;o. J&aacute; troquei o termo procedural do texto por procedimental. E obrigado pelo coment&aacute;rio: elogios e cr&iacute;ticas construticas s&atilde;o sempre muito bem vindas. []s
  • Rodrigo Cacilhas
    Muito bom artigo! J&aacute; tinha lido antes, mas n&atilde;o comentado. Fica aqui ent&atilde;o minha mensagem: meus parab&eacute;ns! Ah! Antes que me esque&ccedil;a... o Bruno est&aacute; certo: o correto &eacute; procedimental. []&#039;s
  • Meus 2 centavos de contribuição (sendo o cara chato que sou...): o termo correto é procedimental e não procedural (que por sua vez é um obscuro, para mim pelo menos hehe, termo jurídico)

    =)

    Bem legal o resumo das diferenças, esta de não haver escopo de bloco como para Ifs e Loops é bem importante ressaltar mesmo, bom saber :)
  • Bruno Patini Furtado
    Meus 2 centavos de contribui&ccedil;&atilde;o (sendo o cara chato que sou...): o termo correto &eacute; procedimental e n&atilde;o procedural (que por sua vez &eacute; um obscuro, para mim pelo menos hehe, termo jur&iacute;dico) =) Bem legal o resumo das diferen&ccedil;as, esta de n&atilde;o haver escopo de bloco como para Ifs e Loops &eacute; bem importante ressaltar mesmo, bom saber :)
blog comments powered by Disqus

Switch to our mobile site