Jump to content

Tutorial de Python para programadores de Java?


Knitter
 Share

Recommended Posts

Bem,

Queria avançar mais nos meus conhecimentos de Python, até ao momento não sei mais que executar alguns comandos na consola, e sempre que pego num tutorial acabo por desistir e pensar que não é linguagem para mim.

Desta vez quero fazer uma aplicação em Python com interface gráfica, acesso a base de dados, processamento de XML e outros ficheiros de texto, por isso preciso de perceber bem como raio funciona esta coisa.

A sintaxe geral conheço, algumas das funções embutidas também. Não tenho problemas em usar os dicionários, listas, etc., mas há algumas coisas que me fazem confusão. Por exemplo, packages VS. módulos, recomendações para a criação e organização de classes, ah e sim, pretendo fazer tudo orientados a objectos.

Há por aí algum tutorial de Python que, além da sintaxe mostre como fazer algumas destas coisas, estilo Java Tutorial? Algum que não seja igual aos que estão por aqui no fórum e na wiki e na referência do Python, porque já por lá passei e as dúvidas são as mesmas.

Link to comment
Share on other sites

Queres orientação a objectos usando o quê?

tk, wx, GTK, Qt...?

Para o wx, recomendo o <link removido>.. Para os outros não sei porque não uso...

Para teres um manual sempre à disposição, com um pouco de tudo e muito do importante, tens o Apress Beggining Python From Novice to Professional.

Depois, aconselho-te a dares uma vista de olhos no projecto Jython.

<link removido> tens vários livros de Python e alguns falam de Jython.

Link to comment
Share on other sites

Queres orientação a objectos usando o quê?

tk, wx, GTK, Qt...?

Segundo consta, orientado a objectos não está dependente da interface gráfica, ou neste caso do toolkit gráfico usado 😉

amigo,

Não sei Java, mas quer algo mais simples que Tutoriais Python ?... será que existe?

Esse é que é o problema, são tão simples que acabam por explicar quase nada.

Usar o interpretador? Fazer do python uma calculadora? Dicionários e restantes estrutura? Isso é o básico, não preciso de nada disso e todos os tópicos/tutorias que vejo são disso.

Por exemplo, não encontrei em lado nenhum da documentação oficial uma forma recomendada para criar classes. Temos lá explicação sobre módulos,

A module can contain executable statements as well as function definitions. These statements are intended to initialize the module. They are executed only the first time the module is imported somewhere
.

Depois de ler isto até tenho medo de colocar a minha classe num módulo, coisas executadas na primeira vez que o módulo for importado? A minha classe vai ser executada?

O problema é que estou demasiado habituado ao Java, logo há muita coisa que vos pode parecer directa e para mim não é...  ainda estou em choque depois do que li sobre controlo de excepções aqui, http://docs.python.org/dev/howto/doanddont.html, como é que é possível um ficheiro não ser fechado num bloco finally? Alguém me explica?

Link to comment
Share on other sites

Não encontraste porque a informação que pretendes é publicada SEMPRE como um PEP. http://www.python.org/dev/peps/pep-0008/

O que tu leste sobre módulos é referente ao __init__, o construtor de cada classe.

Em relação ao finally, se percebi, em implementações que não a CPython, aquilo pode não funcionar como é suposto, porquê não me perguntes porque não sei. Como alternativa, eu faria:

try:
x = fp.read()
except IOerror:
pass
fp.close()

Que toolkit gráfico queres usar?

Para processamento de XML, queres usar o quê? DOM? SAX? XPath?

Para acesso a base de dados, o suporte ao SQlite já vem de origem. http://docs.python.org/lib/module-sqlite3.html

Mais dúvidas?

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Link to comment
Share on other sites

O que tu leste sobre módulos é referente ao __init__, o construtor de cada classe.

O que li é sobre módulos, não fala em lado nenhum de classes, porque é que dizes que é de classes?

try:
x = fp.read()
except IOerror:
pass
fp.close()

Considerando que sei pouco de python, esse código parece-me um pouco... um tiro no pé. Se ocorreu um erro não é suposto tratar o erro?!

Que toolkit gráfico queres usar?

Não sei, só pretendo que seja multi-plataforma, alguma recomendação?

Para processamento de XML, queres usar o quê? DOM? SAX? XPath?

DOM não deverá ser, provavelmente será SAX, só pretendo ler/escrever os ficheiros, os dados serão tratados de outra forma, em estruturas próprias.

Para acesso a base de dados, o suporte ao SQlite já vem de origem. http://docs.python.org/lib/module-sqlite3.html

Era esse que estava a pensar usar, mas já agora, ORM em python existe ou estou a sonhar demasiado alto?

Link to comment
Share on other sites

O que li é sobre módulos, não fala em lado nenhum de classes, porque é que dizes que é de classes?

Módulos/classes, é quase a mesma coisa em Python. Um módulo quando importado tem a mesma sintaxe que uma instância de uma class. Por exemplo, tu em Java tens o módulo com.knitter.lulzware. Em Python, podes criar esse módulo da mesma maneira (pastas), ou então definir sem qualquer ordem e montar um objecto. Cada módulo tem um ficheiro (__init__.py) que serve para instanciar o módulo como objecto, tal como se faz com o método __init__ numa simples class.

Considerando que sei pouco de python, esse código parece-me um pouco... um tiro no pé. Se ocorreu um erro não é suposto tratar o erro?!

No caso de haver um IOerror (a exception a que é feito um raise quando existe um erro a ler de um ficheiro), nós já estamos à espera dele e fazemos o pass, da mesma forma que podiamos fazer um handling decente, aquilo não passou de um exemplo. Anyway, se houver outra (tipo, OSerror, KeyError), ela não é ignorada pelo pass, se é disso que tens medo. Mais sobre error handling (tens a sinxtaxe explicada em BNF): http://docs.python.org/ref/try.html

Não sei, só pretendo que seja multi-plataforma, alguma recomendação?

Para máxima compatibilidade, wxPython (vem do wxWidgets) ou PyGTK (usa o GTK).

DOM não deverá ser, provavelmente será SAX, só pretendo ler/escrever os ficheiros, os dados serão tratados de outra forma, em estruturas próprias.

http://docs.python.org/lib/module-xml.sax.html (artigo sobre o módulo: http://www.devarticles.com/c/a/XML/Parsing-XML-with-SAX-and-Python/)

Era esse que estava a pensar usar, mas já agora, ORM em python existe ou estou a sonhar demasiado alto?

Não faço a mínima ideia.

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Link to comment
Share on other sites

Módulos/classes, é quase a mesma coisa em Python. Um módulo quando importado tem a mesma sintaxe que uma instância de uma class. Por exemplo, tu em Java tens o módulo com.knitter.lulzware. Em Python, podes criar esse módulo da mesma maneira (pastas), ou então definir sem qualquer ordem e montar um objecto. Cada módulo tem um ficheiro (__init__.py) que serve para instanciar o módulo como objecto, tal como se faz com o método __init__ numa simples class.

Não percebi metade do que disseste te tenho dúvidas na metade que sobrou.

Afinal, uma classe e um módulo são a mesma coisa? Posso ter mais que uma classe num mesmo ficheiro?

Se não colocar os ditos ficheiros __init__.py dentro das pastas o que é que acontece?

Link to comment
Share on other sites

Afinal, uma classe e um módulo são a mesma coisa? Posso ter mais que uma classe num mesmo ficheiro?

Classe:

class lulzware:
def __init__(self):
  self._x = []
  self._y = {'o': 3}

def getLulz(self):
  return self._x

Módulo: Pasta com vários ficheiros, tem exactamente a mesma organização e forma de funcionamento que os packages em Java. Quando fazes import modulo, ele constroi o objecto (o ficheiro class.py vai para modulo.class, lulz.py para o modulo.lulz, o extra/ois.py para modulo.extra.ois, o __init__.py para modulo.__init__). Quando instancias um objecto desse modulo, ele executar o __init__ (o construtor da class), que pode estar ou não definido.

Podes ter classes dentro de um módulo. Exemplo para o lulz.py acima:

class tiracio:
def __init__(self):
  self.__ois = []
def getOis(self):
  return self.__ois

Para instanciares esta class, fazes modulo.lulz.tiracio().

Se não colocar os ditos ficheiros __init__.py dentro das pastas o que é que acontece?

Replied above, não acontece nada.

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Link to comment
Share on other sites

comeca pela organizacao mais simples. por defeito um script python e' um modulo e pode ser importado usando a instrucao

import nome_do_ficheiro_sem_a_extensao

depois podes la definir classes a tua vontade tal como outra linguagem qualquer, ao importares um modulo, o que o interpretador faz e' simplesmente avaliar o codigo desse ficheiro.

Como em qualquer outra linguagem quando o codigo de uma classe e' executado o unico metodo que e' automaticamente chamado e' o construtor. Que no caso do python tem sempre o nome __init__ e o seu primeiro parametro e' sempre um ponteiro para a propria classe.

nao tem muito mais que se lhe diga, e' uma abordagem mais simplificada que java ou c++ no que toca a sintaxe.

quanto a aprendizagem eu infelizmente tenho que concordar, a documentacao do python ainda esta longe de ser satisfatoriamente completa. So o basico e' que esta coberto compreensivamente. A documentacao do java.sun.com por exemplo esta noutro campeonato.

o que eu aconselho para aprender uma linguagem e' o que sempre faco: arranja um projecto pessoal, de preferencia pequeno, e usa a linguagem a aprender, neste caso o python. Vais ver que e' muito simples de usar.

ORM nao aconselho, nao ha nenhum modulo que esteja maduro o suficiente. Ha uns poucos mas ainda estao muito verdinhos e ainda nao ha nenhum que seja mantido por uma entidade solida, sao todos desenvolvidos por uma ou outra alma caridosa de uns amadores que ai andam.

Talvez daqui a um ano ou dois haja mais opcoes. Neste momento ate' em php estas melhor servido no que toca ORM.

Link to comment
Share on other sites

Como em qualquer outra linguagem quando o codigo de uma classe e' executado o unico metodo que e' automaticamente chamado e' o construtor. Que no caso do python tem sempre o nome __init__ e o seu primeiro parametro e' sempre um ponteiro para a propria classe.

Isso será no python e não em qualquer outra linguagem, não gosto muito que seja executado código que eu não mandei.

nao tem muito mais que se lhe diga, e' uma abordagem mais simplificada que java ou c++ no que toca a sintaxe.

Já não é a primeira vez que me dizem isso, mas por mais que tente, não vejo no python simplificação nenhuma. Seria de esperar encontrar alguma facilidade no python, tendo em conta que aprendi a programar com C, mas sinceramente não consigo.

o que eu aconselho para aprender uma linguagem e' o que sempre faco: arranja um projecto pessoal, de preferencia pequeno, e usa a linguagem a aprender, neste caso o python. Vais ver que e' muito simples de usar.

É o que estou a tentar fazer mas queria fazer o raio da modelação do sistema e, não tendo algumas das bases de como a tecnologia funciona, acabei por fazer um modelo, que me parece não ser adequado.

ORM nao aconselho, nao ha nenhum modulo que esteja maduro o suficiente.

Isso vai ser incómodo, mas não será o maior dos meus problemas.

Bem, vou ver o que daqui saí.

Link to comment
Share on other sites

Lol eu tive exactamente o mesmo problema quando tentei entrar no python, parece que falta sempre qualquer coisa, embora exista muita documentação parece que só tem o básico. Isso dos módulos também me fez confusão. Talvez um deste dias volte a tentar o python.

I haven’t lost my mind; it’s backed up on DVD somewhere!

Link to comment
Share on other sites

Knitter, eu estou a usar MySQL com a lib mysql para python e tenho-me dado bem. Quanto a XML uso uma outra lib chamada libxml2 que tem feito o trabalho (de ler, porque só leio XML, não escrevo) lindamente.

Deixo-te aqui um ou dois links que te (talvez) possam ajudar:

http://www.razorvine.net/python/PythonForJavaProgrammers

http://www.jython.org/Project/

Link to comment
Share on other sites

Knitter, eu estou a usar MySQL com a lib mysql para python e tenho-me dado bem. Quanto a XML uso uma outra lib chamada libxml2 que tem feito o trabalho (de ler, porque só leio XML, não escrevo) lindamente.

O problema não será usar uma biblioteca para aceder aos dados, teria de a usar de qualquer forma, fosse qual fosse a tecnologia, o problema é  implementar os padrões de acesso a dados correctamente, mas já começo a ver que não será em python, seria óptimo mas não vou perder o meu tempo com isso neste momento.

Para XML é que dava mesmo jeito conseguir escrever, pelo pouco que li, e pelo que é apregoado em todos os sítios que recomendam python, existirá um suporte para XML no python, que espero, seja mais que ler.

Esse link parecia a solução para os meus problemas, mas depois de ler algumas coisas que estavam escritas e começar a ver a comparação que ele apresenta, comecei a perguntar-me se o autor nunca usou Java e fez um mau trabalho de pesquisa, ou se é simplesmente um idiota. Ele diz com cada coisa.... a afirmação dele de que não consegues fazer um buffer overflow em pyhton ainda me está a bater no fundo do cérebro. Enfim, vou ver os textos todos até ao fim.

Obrigado pelo link.

EDIT:

Apanhei agora a parte referente a threads... Hum... python + thread = not thread safe! Global lock para se poder usar threads?

Desculpem, mas sinto-me a andar para trás.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.