SlideShare uma empresa Scribd logo
1 de 40
Baixar para ler offline
Scripting e desenvolvimento
                     ágil de aplicações
                    Java EE com Jython
                                    Luciano Ramalho         Rafael Nunes
                               ramalho@turing.com.br   rafael@yaw.com.br
                                           @luciano          @rafanunes
Wednesday, December 21, 2011
Exemplo: relógio Java Swing
                               # coding: utf-8
                               from javax.swing import *
                               from java.awt import Font
                               from time import strftime

                               class Relogio(JFrame):
                                   def __init__(self):
                                       JFrame.__init__(self, u'TicTac',
                                           defaultCloseOperation = JFrame.DISPOSE_ON_CLOSE)
                                       self.mostrador = JLabel('00:00:00',
                                           font=Font('Sanserif',Font.BOLD, 70))
     Função                            self.contentPane.add(self.mostrador)
                                       self.pack()

    callback                           self.visible = True


       como
                                   def start(self):
                                       def tic(evento):
                                           agora = strftime('%H:%M:%S')
     listener                              if self.mostrador.text != agora:
                                               self.mostrador.text = agora
                                       Timer(100, tic).start()

                               if __name__=='__main__':
                                   rel = Relogio()
                                   rel.start()
Wednesday, December 21, 2011
Exemplo: relógio Java Swing
                from jrelogio import Relogio
                rel = Relogio()
                rel.start()

                from java.awt import *
                rel.mostrador.foreground = Color.RED

                print rel.mostrador.text

                from time import sleep
                while True:
                    if rel.mostrador.text.endswith('0'):
                        print 'PING', rel.mostrador.text
                    sleep(1)




Wednesday, December 21, 2011
é

Wednesday, December 21, 2011
Sobre Python
             Linguagem de uso geral
                  Web, desktop, redes, computação gráfica e científica
             Multi-plataforma
                  Linux, Windows, Mac, Unix, Nokia S-60...
             Amplo suporte de fornecedores de TI
                  Google, IBM, Oracle, Microsoft, RedHat, Amazon...
             Sintaxe simples e clara mas muito expressiva
                               Aprendizagem rápida, produtividade em dias

Wednesday, December 21, 2011
Exemplo: cliente Twitter
          # coding: utf-8
          import sys
          import urllib
          import simplejson as json

          if len(sys.argv) == 2:
              busca = sys.argv[1]
          else:
              print 'Informe o texto da busca: %s "texto"' % __file__
              sys.exit(1)

          url = 'http://search.twitter.com/search.json?q='+busca
          resposta = urllib.urlopen(url).read()
          documento = json.loads(resposta)
          resultados = documento['results']
          for resultado in resultados:
              print u'%(from_user)s: %(text)sn' % resultado
          print '%s resuldados exibidos' % len(resultados)




Wednesday, December 21, 2011
Exemplo: planilha
        class Planilha:
            _cels = {}
            def __init__(self, **funcs):
                self._funcs = funcs
            def __setitem__(self, chave, formula):
                self._cels[chave] = formula
            def formula(self, chave):
                return self._cels[chave]
            def __getitem__(self, chave ):
                return eval(self._cels[chave], self._funcs, self)
                               >>>   from math import pi, sin
                               >>>   from planilha import Planilha
                               >>>   p = Planilha(sin=sin, pi=pi)
                               >>>   p['a1'] = '.5'
                               >>>   p['a2'] = 'pi'
                               >>>   p['b1'] = 'a1*a2'
                               >>>   p['b2'] = 'sin(b1)'
                               >>>   p['b2']
                               1.0
Wednesday, December 21, 2011
Quem usa Python?




Wednesday, December 21, 2011
Wednesday, December 21, 2011
Wednesday, December 21, 2011
Wednesday, December 21, 2011
Wednesday, December 21, 2011
Áreas de aplicação
              desenvolvimento Web
              computação gráfica
              administração de sistemas
              integração de sistemas (glue language)
              computação científica
              games




Wednesday, December 21, 2011
YouTube
Wednesday, December 21, 2011
Wednesday, December 21, 2011
                               Globo.com usa Django
Mozilla Firefox Add-Ons
Wednesday, December 21, 2011
Dropbox
Wednesday, December 21, 2011
Google App Engine
Wednesday, December 21, 2011
The Foundry, NUKE
Wednesday, December 21, 2011
Industrial Light & Magic
Wednesday, December 21, 2011
Autodesk Maya
Wednesday, December 21, 2011
Invesalius
Wednesday, December 21, 2011
FBI e CIA
Wednesday, December 21, 2011
brasil.gov.br
Wednesday, December 21, 2011
Projetos Open Source




Wednesday, December 21, 2011
Características

              Não obriga a declarar variáveis, mas obriga a inicializar

                               >>> a = 10
                               >>> c = a + b
                               Traceback (most recent call last):
                                 File "<stdin>", line 1, in <module>
                               NameError: name 'b' is not defined




Wednesday, December 21, 2011
Características 2
              Tipagem dinâmica forte, obriga conversões explícitas

             >>> a = '9'
             >>> b = 10
             >>> c = a + b
             Traceback (most recent call last):
               File "<stdin>", line 1, in <module>
             TypeError: cannot concatenate 'str' and 'int' objects




Wednesday, December 21, 2011
Características 3
              Orientada a objetos, mas não obriga a criar classes
              Suporta sobrecarga de operadores e herança múltipla
              Usa exceções, mas não obriga a declarar ou tratar
              Usa namespaces, módulos e pacotes
              Compilada para bytecode
              Suporte nativo a properties




Wednesday, December 21, 2011
Exemplo: property read-only
       class ItemPedido(object):
           def __init__(self, descr, pr_unit, qtd):
               self.descr = descr
               self.pr_unit = pr_unit
               self.qtd = qtd

                 @property
                 def total(self):
                     return self.pr_unit * self.qtd

                               >>> bolas = ItemPedido('bola', 3.1, 10)
                               >>> bolas.descr
                               'bola'
                               >>> bolas.total
                               31.0
                               >>> bolas.total = 30
                               Traceback (most recent call last):
                                  ...
                               AttributeError: can't set attribute
Wednesday, December 21, 2011
Exemplo: property read-write
                               class ItemPedido(object):
                                   def __init__(self, descr, pr_unit, qtd):
                                       self.descr = descr
                                       self.pr_unit = pr_unit
                                       self.qtd = qtd

                                   @property
                                   def total(self):
                                       return self.pr_unit * self.qtd

                                   @property
                                   def qtd(self):
                                       return self.__qtd

                                   @qtd.setter
                                   def qtd(self, valor):
                                       if valor < 1:
                                           raise ValueError('quantidade < 1')
                                       else:
                                           self.__qtd = valor


Wednesday, December 21, 2011
>>> bolas = ItemPedido('bola', 3.1, 10)
   Propriedade             >>> bolas.descr
                           'bola'
   (exemplo 2)             >>> bolas.total
                           31.0
                           >>> bolas.qtd = -3
                           Traceback (most recent call last):
class ItemPedido(object):    ...
                           ValueError: quantidade < 1
    def __init__(self, descr, pr_unit, qtd):
        self.descr = descr >>> duendes = ItemPedido('duende', 999, 0)
                           Traceback (most recent call last):
        self.pr_unit = pr_unit
        self.qtd = qtd       ...
                           ValueError: quantidade < 1
         @property
         def total(self):
             return self.pr_unit * self.qtd

         @property
         def qtd(self):
             return self.__qtd

         @qtd.setter
         def qtd(self, valor):
             if valor < 1:
                 raise ValueError('quantidade < 1')
             else:
                 self.__qtd = valor
Wednesday, December 21, 2011
Implementações
           CPython: o interpretador python padrão,
           implementando em C
                 pré-instalado na maioria dos Linux e no OSX
           Jython: implementado em Java, roda sobre a JVM
           IronPython: implementado em C#, roda sobre .net CLR
           PyPy: implementado em Python, compilação JIT




Wednesday, December 21, 2011
Jython falando com Java


Wednesday, December 21, 2011
Jython no ambiente Java EE
            Jython é a principal linguagem
            de scripting suportada e
            documentada nos produtos:
                  Oracle WebLogic
                  IBM WebSphere




Wednesday, December 21, 2011
Introspecção e Reflexão
              Uma classe Java com dois atributos privados

                         public class ObjetoSecreto {

                         ! private String escondido = "";
                         ! private String oculto = "dado ultra secreto";

                         ! public ObjetoSecreto(String texto) {
                         ! ! this.escondido = texto;
                         ! }
                         }




Wednesday, December 21, 2011
Acesso a atributo privado
               import java.lang.reflect.Field;
                                                                                         Java
               public class AcessaPrivado {

               !     public static void main(String[] args) {
               !     ! ObjetoSecreto oSecreto = new ObjetoSecreto("senha super secreta");
               !     ! Field campoPrivado = null;
               !     ! try {
               !     ! ! campoPrivado = ObjetoSecreto.class.getDeclaredField("escondido");
               !     ! }
               !     ! catch (NoSuchFieldException e) {
               !     ! ! System.err.println(e);
               !     ! ! System.exit(1);
               !     ! }
               !
               !
                     ! campoPrivado.setAccessible(true); // arrombamos a porta
                     ! try {
                                                                                        Python
               !     ! ! String tavaEscondido = (String) campoPrivado.get(oSecreto);
               !     ! ! System.out.println("oSecreto.escondido = " + tavaEscondido);
               !     ! }
               !     ! catch (IllegalAccessException e) {
                                         import ObjetoSecreto
               !     ! ! // esta exceção nao acontece porque fizemos setAcessible(true)
               !     ! ! System.err.println(e); = ObjetoSecreto('senha super secreta')
                                         oSecreto
               !     ! }!                campoPrivado = ObjetoSecreto.getDeclaredField('escondido')
               !     }                   campoPrivado.setAccessible(True) # arrombamos a porta
               }                        print 'oSecreto.escondido =', campoPrivado.get(oSecreto)

Wednesday, December 21, 2011
Acesso a atributo privado 2
       import ObjetoSecreto

       oSecreto = ObjetoSecreto('senha super secreta')
       campoPrivado = ObjetoSecreto.getDeclaredField('escondido')
       campoPrivado.setAccessible(True) # arrombamos a porta
       print 'oSecreto.escondido =', campoPrivado.get(oSecreto)

                       from java.lang.reflect import Modifier               listar
                       import ObjetoSecreto
                                                                          todos os
                                                                          atributos
                       oSecreto = ObjetoSecreto('senha super secreta')
                       campos = ObjetoSecreto.getDeclaredFields()
                       for campo in campos:
                           # so campos privados!
                                                                          privados
                           if Modifier.isPrivate(campo.getModifiers()):
                               print campo
                               campo.setAccessible(True) # arrombamos a porta
                               print 't', campo.getName(), '=', campo.get(oSecreto)




Wednesday, December 21, 2011
Exemplo: relógio Java Swing
   Java bean                   from javax.swing import *
                               from java.awt import Font
   setter                      from time import strftime

   acionado                    frame = JFrame(u'Relógio',
   no                              defaultCloseOperation = JFrame.EXIT_ON_CLOSE)

   construtor                  rel = JLabel('00:00:00',
                                   font=Font('Sanserif',Font.BOLD,70))
   e                           frame.contentPane.add(rel)
                               frame.pack()
   setter                      frame.visible = True

   acionado                    def tic(evento):
   como                            agora = strftime('%H:%M:%S')
                                   if rel.text != agora:
   property                            rel.text = agora

                               Timer(100, tic).start()
Wednesday, December 21, 2011
Onde aprender
         mais

              jython.org
                   Jython book livre (CC)
              python.org
              python.org.br
              Google Groups: python-brasil



Wednesday, December 21, 2011
Academia
     Python
     Globalcode
              A partir de janeiro
              de 2012 em SP
              112h de aula
              do básico ao
              avançado em
              3,5 meses



Wednesday, December 21, 2011

Mais conteúdo relacionado

Mais procurados

Mais procurados (17)

Python 03
Python 03Python 03
Python 03
 
Iteraveis e geradores em Python
Iteraveis e geradores em PythonIteraveis e geradores em Python
Iteraveis e geradores em Python
 
Javascript
JavascriptJavascript
Javascript
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em Python
 
Introdução à Linguagem de programação Python
Introdução à Linguagem de programação PythonIntrodução à Linguagem de programação Python
Introdução à Linguagem de programação Python
 
Meta-programacao em python
Meta-programacao em pythonMeta-programacao em python
Meta-programacao em python
 
Python: Iteraveis, geradores etc
Python: Iteraveis, geradores etcPython: Iteraveis, geradores etc
Python: Iteraveis, geradores etc
 
Project coin pequenas mudanças grandes facilidades
Project coin pequenas mudanças grandes facilidadesProject coin pequenas mudanças grandes facilidades
Project coin pequenas mudanças grandes facilidades
 
Java8
Java8Java8
Java8
 
Aula actionscript basico
Aula actionscript basicoAula actionscript basico
Aula actionscript basico
 
Java6
Java6Java6
Java6
 
J1Brasil: Persistência de Dados além do JPA, ou Como usar noSQL em Java
J1Brasil: Persistência de Dados além do JPA, ou Como usar noSQL em JavaJ1Brasil: Persistência de Dados além do JPA, ou Como usar noSQL em Java
J1Brasil: Persistência de Dados além do JPA, ou Como usar noSQL em Java
 
Interface grafica
Interface graficaInterface grafica
Interface grafica
 
Java 06
Java 06Java 06
Java 06
 
Semana 9: toString, classes, instâncias e objectos, Scanner
Semana  9: toString, classes, instâncias e objectos, ScannerSemana  9: toString, classes, instâncias e objectos, Scanner
Semana 9: toString, classes, instâncias e objectos, Scanner
 
Python
PythonPython
Python
 
Java 14
Java 14Java 14
Java 14
 

Semelhante a Jython no JavaOne Latin America 2011

Python, a arma secreta do Google
Python, a arma secreta do GooglePython, a arma secreta do Google
Python, a arma secreta do GoogleLuciano Ramalho
 
Curso matlab 6 especiais
Curso matlab 6 especiaisCurso matlab 6 especiais
Curso matlab 6 especiaisJosh Santos
 
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop PythonIEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop PythonDiogo Gomes
 
Programando para web com python - Introdução a Python
Programando para web com python - Introdução a PythonProgramando para web com python - Introdução a Python
Programando para web com python - Introdução a PythonAlvaro Oliveira
 
OO em Python sem sotaque
OO em Python sem sotaqueOO em Python sem sotaque
OO em Python sem sotaqueLuciano Ramalho
 
Introdução à Programação em Python
Introdução à Programação em PythonIntrodução à Programação em Python
Introdução à Programação em PythonRodrigo Hübner
 
Web2py: Desenvolvimento Ágil de Aplicações Web com Python
Web2py: Desenvolvimento Ágil de Aplicações Web com PythonWeb2py: Desenvolvimento Ágil de Aplicações Web com Python
Web2py: Desenvolvimento Ágil de Aplicações Web com Pythonchackero
 
Programando em python interfaces graficas com tk
Programando em python   interfaces graficas com tkProgramando em python   interfaces graficas com tk
Programando em python interfaces graficas com tksamuelthiago
 
Django Apps - Do Núcleo a Otimização
Django Apps - Do Núcleo a OtimizaçãoDjango Apps - Do Núcleo a Otimização
Django Apps - Do Núcleo a OtimizaçãoLeandro Zanuz
 
Introdução a Machine Learning e TensorFlow
Introdução a Machine Learning e TensorFlowIntrodução a Machine Learning e TensorFlow
Introdução a Machine Learning e TensorFlowGuilherme Campos
 
Introdução a Machine Learning e TensorFlow
Introdução a Machine Learning e TensorFlowIntrodução a Machine Learning e TensorFlow
Introdução a Machine Learning e TensorFlowDevMT
 
Inteligencia artificial 10
Inteligencia artificial 10Inteligencia artificial 10
Inteligencia artificial 10Nauber Gois
 

Semelhante a Jython no JavaOne Latin America 2011 (20)

Python, a arma secreta do Google
Python, a arma secreta do GooglePython, a arma secreta do Google
Python, a arma secreta do Google
 
Curso matlab 6 especiais
Curso matlab 6 especiaisCurso matlab 6 especiais
Curso matlab 6 especiais
 
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop PythonIEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
 
Curso de Node JS Básico
Curso de Node JS BásicoCurso de Node JS Básico
Curso de Node JS Básico
 
Programando para web com python - Introdução a Python
Programando para web com python - Introdução a PythonProgramando para web com python - Introdução a Python
Programando para web com python - Introdução a Python
 
Python2.5.ppt
Python2.5.pptPython2.5.ppt
Python2.5.ppt
 
MRO simula
MRO simulaMRO simula
MRO simula
 
Palestra2009
Palestra2009Palestra2009
Palestra2009
 
OO em Python sem sotaque
OO em Python sem sotaqueOO em Python sem sotaque
OO em Python sem sotaque
 
M2ti - Python Brasil
M2ti - Python BrasilM2ti - Python Brasil
M2ti - Python Brasil
 
Introdução à Programação em Python
Introdução à Programação em PythonIntrodução à Programação em Python
Introdução à Programação em Python
 
Web2py: Desenvolvimento Ágil de Aplicações Web com Python
Web2py: Desenvolvimento Ágil de Aplicações Web com PythonWeb2py: Desenvolvimento Ágil de Aplicações Web com Python
Web2py: Desenvolvimento Ágil de Aplicações Web com Python
 
Programando em python interfaces graficas com tk
Programando em python   interfaces graficas com tkProgramando em python   interfaces graficas com tk
Programando em python interfaces graficas com tk
 
Django Apps - Do Núcleo a Otimização
Django Apps - Do Núcleo a OtimizaçãoDjango Apps - Do Núcleo a Otimização
Django Apps - Do Núcleo a Otimização
 
Aula 01
Aula 01Aula 01
Aula 01
 
MRO predict
MRO predictMRO predict
MRO predict
 
Introdução a Machine Learning e TensorFlow
Introdução a Machine Learning e TensorFlowIntrodução a Machine Learning e TensorFlow
Introdução a Machine Learning e TensorFlow
 
Introdução a Machine Learning e TensorFlow
Introdução a Machine Learning e TensorFlowIntrodução a Machine Learning e TensorFlow
Introdução a Machine Learning e TensorFlow
 
Tdc2010
Tdc2010Tdc2010
Tdc2010
 
Inteligencia artificial 10
Inteligencia artificial 10Inteligencia artificial 10
Inteligencia artificial 10
 

Mais de Luciano Ramalho

Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem PythonLuciano Ramalho
 
Encapsulamento com descritores
Encapsulamento com descritoresEncapsulamento com descritores
Encapsulamento com descritoresLuciano Ramalho
 
Arduino: hardware hacking & coding dojo
Arduino: hardware hacking & coding dojoArduino: hardware hacking & coding dojo
Arduino: hardware hacking & coding dojoLuciano Ramalho
 
Encapsulamento com Descritores em Python
Encapsulamento com Descritores em PythonEncapsulamento com Descritores em Python
Encapsulamento com Descritores em PythonLuciano Ramalho
 
Alex Martelli's Python Design Patterns
Alex Martelli's Python Design PatternsAlex Martelli's Python Design Patterns
Alex Martelli's Python Design PatternsLuciano Ramalho
 
JavaScript agora é sério (TDC 2011)
JavaScript agora é sério (TDC 2011)JavaScript agora é sério (TDC 2011)
JavaScript agora é sério (TDC 2011)Luciano Ramalho
 
JavaScript agora é sério (FISL 2011)
JavaScript agora é sério (FISL 2011)JavaScript agora é sério (FISL 2011)
JavaScript agora é sério (FISL 2011)Luciano Ramalho
 
JavaScript: agora é sério
JavaScript: agora é sérioJavaScript: agora é sério
JavaScript: agora é sérioLuciano Ramalho
 
Porque bibliotecários usam bancos de dados esquisitos
Porque bibliotecários usam bancos de dados esquisitosPorque bibliotecários usam bancos de dados esquisitos
Porque bibliotecários usam bancos de dados esquisitosLuciano Ramalho
 
NoSQL na BIREME: 20 anos de experiência
NoSQL na BIREME: 20 anos de experiênciaNoSQL na BIREME: 20 anos de experiência
NoSQL na BIREME: 20 anos de experiênciaLuciano Ramalho
 

Mais de Luciano Ramalho (20)

Wiki-wiki S/A
Wiki-wiki S/AWiki-wiki S/A
Wiki-wiki S/A
 
Mongodb: agregação
Mongodb: agregaçãoMongodb: agregação
Mongodb: agregação
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem Python
 
Encapsulamento com descritores
Encapsulamento com descritoresEncapsulamento com descritores
Encapsulamento com descritores
 
Arduino: hardware hacking & coding dojo
Arduino: hardware hacking & coding dojoArduino: hardware hacking & coding dojo
Arduino: hardware hacking & coding dojo
 
Encapsulamento com Descritores em Python
Encapsulamento com Descritores em PythonEncapsulamento com Descritores em Python
Encapsulamento com Descritores em Python
 
Dojo com Processing
Dojo com ProcessingDojo com Processing
Dojo com Processing
 
Dojo com Arduino
Dojo com ArduinoDojo com Arduino
Dojo com Arduino
 
Open Library no Mongodb
Open Library no MongodbOpen Library no Mongodb
Open Library no Mongodb
 
Modelos ricos
Modelos ricosModelos ricos
Modelos ricos
 
Ensinando OO com Python
Ensinando OO com PythonEnsinando OO com Python
Ensinando OO com Python
 
Alex Martelli's Python Design Patterns
Alex Martelli's Python Design PatternsAlex Martelli's Python Design Patterns
Alex Martelli's Python Design Patterns
 
Dspace em 5 minutos
Dspace em 5 minutosDspace em 5 minutos
Dspace em 5 minutos
 
JavaScript agora é sério (TDC 2011)
JavaScript agora é sério (TDC 2011)JavaScript agora é sério (TDC 2011)
JavaScript agora é sério (TDC 2011)
 
JavaScript agora é sério (FISL 2011)
JavaScript agora é sério (FISL 2011)JavaScript agora é sério (FISL 2011)
JavaScript agora é sério (FISL 2011)
 
Wiki sa-v2
Wiki sa-v2Wiki sa-v2
Wiki sa-v2
 
JavaScript: agora é sério
JavaScript: agora é sérioJavaScript: agora é sério
JavaScript: agora é sério
 
Porque bibliotecários usam bancos de dados esquisitos
Porque bibliotecários usam bancos de dados esquisitosPorque bibliotecários usam bancos de dados esquisitos
Porque bibliotecários usam bancos de dados esquisitos
 
Binary divination
Binary divinationBinary divination
Binary divination
 
NoSQL na BIREME: 20 anos de experiência
NoSQL na BIREME: 20 anos de experiênciaNoSQL na BIREME: 20 anos de experiência
NoSQL na BIREME: 20 anos de experiência
 

Jython no JavaOne Latin America 2011

  • 1. Scripting e desenvolvimento ágil de aplicações Java EE com Jython Luciano Ramalho Rafael Nunes ramalho@turing.com.br rafael@yaw.com.br @luciano @rafanunes Wednesday, December 21, 2011
  • 2. Exemplo: relógio Java Swing # coding: utf-8 from javax.swing import * from java.awt import Font from time import strftime class Relogio(JFrame): def __init__(self): JFrame.__init__(self, u'TicTac', defaultCloseOperation = JFrame.DISPOSE_ON_CLOSE) self.mostrador = JLabel('00:00:00', font=Font('Sanserif',Font.BOLD, 70)) Função self.contentPane.add(self.mostrador) self.pack() callback self.visible = True como def start(self): def tic(evento): agora = strftime('%H:%M:%S') listener if self.mostrador.text != agora: self.mostrador.text = agora Timer(100, tic).start() if __name__=='__main__': rel = Relogio() rel.start() Wednesday, December 21, 2011
  • 3. Exemplo: relógio Java Swing from jrelogio import Relogio rel = Relogio() rel.start() from java.awt import * rel.mostrador.foreground = Color.RED print rel.mostrador.text from time import sleep while True: if rel.mostrador.text.endswith('0'): print 'PING', rel.mostrador.text sleep(1) Wednesday, December 21, 2011
  • 5. Sobre Python Linguagem de uso geral Web, desktop, redes, computação gráfica e científica Multi-plataforma Linux, Windows, Mac, Unix, Nokia S-60... Amplo suporte de fornecedores de TI Google, IBM, Oracle, Microsoft, RedHat, Amazon... Sintaxe simples e clara mas muito expressiva Aprendizagem rápida, produtividade em dias Wednesday, December 21, 2011
  • 6. Exemplo: cliente Twitter # coding: utf-8 import sys import urllib import simplejson as json if len(sys.argv) == 2: busca = sys.argv[1] else: print 'Informe o texto da busca: %s "texto"' % __file__ sys.exit(1) url = 'http://search.twitter.com/search.json?q='+busca resposta = urllib.urlopen(url).read() documento = json.loads(resposta) resultados = documento['results'] for resultado in resultados: print u'%(from_user)s: %(text)sn' % resultado print '%s resuldados exibidos' % len(resultados) Wednesday, December 21, 2011
  • 7. Exemplo: planilha class Planilha: _cels = {} def __init__(self, **funcs): self._funcs = funcs def __setitem__(self, chave, formula): self._cels[chave] = formula def formula(self, chave): return self._cels[chave] def __getitem__(self, chave ): return eval(self._cels[chave], self._funcs, self) >>> from math import pi, sin >>> from planilha import Planilha >>> p = Planilha(sin=sin, pi=pi) >>> p['a1'] = '.5' >>> p['a2'] = 'pi' >>> p['b1'] = 'a1*a2' >>> p['b2'] = 'sin(b1)' >>> p['b2'] 1.0 Wednesday, December 21, 2011
  • 8. Quem usa Python? Wednesday, December 21, 2011
  • 13. Áreas de aplicação desenvolvimento Web computação gráfica administração de sistemas integração de sistemas (glue language) computação científica games Wednesday, December 21, 2011
  • 15. Wednesday, December 21, 2011 Globo.com usa Django
  • 18. Google App Engine Wednesday, December 21, 2011
  • 19. The Foundry, NUKE Wednesday, December 21, 2011
  • 20. Industrial Light & Magic Wednesday, December 21, 2011
  • 23. FBI e CIA Wednesday, December 21, 2011
  • 25. Projetos Open Source Wednesday, December 21, 2011
  • 26. Características Não obriga a declarar variáveis, mas obriga a inicializar >>> a = 10 >>> c = a + b Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'b' is not defined Wednesday, December 21, 2011
  • 27. Características 2 Tipagem dinâmica forte, obriga conversões explícitas >>> a = '9' >>> b = 10 >>> c = a + b Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot concatenate 'str' and 'int' objects Wednesday, December 21, 2011
  • 28. Características 3 Orientada a objetos, mas não obriga a criar classes Suporta sobrecarga de operadores e herança múltipla Usa exceções, mas não obriga a declarar ou tratar Usa namespaces, módulos e pacotes Compilada para bytecode Suporte nativo a properties Wednesday, December 21, 2011
  • 29. Exemplo: property read-only class ItemPedido(object): def __init__(self, descr, pr_unit, qtd): self.descr = descr self.pr_unit = pr_unit self.qtd = qtd @property def total(self): return self.pr_unit * self.qtd >>> bolas = ItemPedido('bola', 3.1, 10) >>> bolas.descr 'bola' >>> bolas.total 31.0 >>> bolas.total = 30 Traceback (most recent call last): ... AttributeError: can't set attribute Wednesday, December 21, 2011
  • 30. Exemplo: property read-write class ItemPedido(object): def __init__(self, descr, pr_unit, qtd): self.descr = descr self.pr_unit = pr_unit self.qtd = qtd @property def total(self): return self.pr_unit * self.qtd @property def qtd(self): return self.__qtd @qtd.setter def qtd(self, valor): if valor < 1: raise ValueError('quantidade < 1') else: self.__qtd = valor Wednesday, December 21, 2011
  • 31. >>> bolas = ItemPedido('bola', 3.1, 10) Propriedade >>> bolas.descr 'bola' (exemplo 2) >>> bolas.total 31.0 >>> bolas.qtd = -3 Traceback (most recent call last): class ItemPedido(object): ... ValueError: quantidade < 1 def __init__(self, descr, pr_unit, qtd): self.descr = descr >>> duendes = ItemPedido('duende', 999, 0) Traceback (most recent call last): self.pr_unit = pr_unit self.qtd = qtd ... ValueError: quantidade < 1 @property def total(self): return self.pr_unit * self.qtd @property def qtd(self): return self.__qtd @qtd.setter def qtd(self, valor): if valor < 1: raise ValueError('quantidade < 1') else: self.__qtd = valor Wednesday, December 21, 2011
  • 32. Implementações CPython: o interpretador python padrão, implementando em C pré-instalado na maioria dos Linux e no OSX Jython: implementado em Java, roda sobre a JVM IronPython: implementado em C#, roda sobre .net CLR PyPy: implementado em Python, compilação JIT Wednesday, December 21, 2011
  • 33. Jython falando com Java Wednesday, December 21, 2011
  • 34. Jython no ambiente Java EE Jython é a principal linguagem de scripting suportada e documentada nos produtos: Oracle WebLogic IBM WebSphere Wednesday, December 21, 2011
  • 35. Introspecção e Reflexão Uma classe Java com dois atributos privados public class ObjetoSecreto { ! private String escondido = ""; ! private String oculto = "dado ultra secreto"; ! public ObjetoSecreto(String texto) { ! ! this.escondido = texto; ! } } Wednesday, December 21, 2011
  • 36. Acesso a atributo privado import java.lang.reflect.Field; Java public class AcessaPrivado { ! public static void main(String[] args) { ! ! ObjetoSecreto oSecreto = new ObjetoSecreto("senha super secreta"); ! ! Field campoPrivado = null; ! ! try { ! ! ! campoPrivado = ObjetoSecreto.class.getDeclaredField("escondido"); ! ! } ! ! catch (NoSuchFieldException e) { ! ! ! System.err.println(e); ! ! ! System.exit(1); ! ! } ! ! ! campoPrivado.setAccessible(true); // arrombamos a porta ! try { Python ! ! ! String tavaEscondido = (String) campoPrivado.get(oSecreto); ! ! ! System.out.println("oSecreto.escondido = " + tavaEscondido); ! ! } ! ! catch (IllegalAccessException e) { import ObjetoSecreto ! ! ! // esta exceção nao acontece porque fizemos setAcessible(true) ! ! ! System.err.println(e); = ObjetoSecreto('senha super secreta') oSecreto ! ! }! campoPrivado = ObjetoSecreto.getDeclaredField('escondido') ! } campoPrivado.setAccessible(True) # arrombamos a porta } print 'oSecreto.escondido =', campoPrivado.get(oSecreto) Wednesday, December 21, 2011
  • 37. Acesso a atributo privado 2 import ObjetoSecreto oSecreto = ObjetoSecreto('senha super secreta') campoPrivado = ObjetoSecreto.getDeclaredField('escondido') campoPrivado.setAccessible(True) # arrombamos a porta print 'oSecreto.escondido =', campoPrivado.get(oSecreto) from java.lang.reflect import Modifier listar import ObjetoSecreto todos os atributos oSecreto = ObjetoSecreto('senha super secreta') campos = ObjetoSecreto.getDeclaredFields() for campo in campos: # so campos privados! privados if Modifier.isPrivate(campo.getModifiers()): print campo campo.setAccessible(True) # arrombamos a porta print 't', campo.getName(), '=', campo.get(oSecreto) Wednesday, December 21, 2011
  • 38. Exemplo: relógio Java Swing Java bean from javax.swing import * from java.awt import Font setter from time import strftime acionado frame = JFrame(u'Relógio', no defaultCloseOperation = JFrame.EXIT_ON_CLOSE) construtor rel = JLabel('00:00:00', font=Font('Sanserif',Font.BOLD,70)) e frame.contentPane.add(rel) frame.pack() setter frame.visible = True acionado def tic(evento): como agora = strftime('%H:%M:%S') if rel.text != agora: property rel.text = agora Timer(100, tic).start() Wednesday, December 21, 2011
  • 39. Onde aprender mais jython.org Jython book livre (CC) python.org python.org.br Google Groups: python-brasil Wednesday, December 21, 2011
  • 40. Academia Python Globalcode A partir de janeiro de 2012 em SP 112h de aula do básico ao avançado em 3,5 meses Wednesday, December 21, 2011