熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

幸福的聯姻:Java 和 Python

2013-11-15 11:50:54  來源: JSP教程 

  本文節錄自《 Learning Python 》一書第十章〈Frameworks and Applications〉
  
  JPython 是最近出現的一個 Python 分支由 Jim Hugunin 先生完全以 Java 撰寫完成對於 Python 和 Java 陣營來說JPython 的出現相當令人興奮Python 使用者相當高興他們現有的 Python 知識可以應用到 Java 的開發環境中Java 的使用者也很高興他們能夠使用 Python 當作描述語言(scripting language)來操作 Java 系統測試鏈接庫並在直譯環境中學習 Java 鏈接庫
  
  
  
  你可以在 取得 JPython其授權方式類似於 CPython(為了有別於 Java 版的 JPython原先版本的 Python 改叫 CPython )
  
  
  
  JPython 安裝好之後包含了
  
  l jpythonJPython 的直譯環境
  
  l jpythonc用來將 JPython 程序編譯成 Java 的 bytecode 產生出來的程序就和一般的 Java 類別檔沒有兩樣可以用來產生 appletservletbean 等
  
  l 一套程序模塊提供標准的 Python 鏈接庫給 JPython 的使用者
  
  l 一些范例程序用來展示 JPython 的多重風貌
  
  
  
  JPython 的使用方式和 Python 很類似請看下面的例子
  
  
  
  ~/book> jpython
  
  JPython on javabeta
  
  Copyright Corporation for National Research Initiatives
  
  >>> +
  
  
  
  
  
  事實上JPython 和 CPython 的運作方式幾乎一樣想知道兩者有何真正的差異最新的資料可以從 取得其中最大的差異在
  
  l JPython 目前比 CPython 慢有多慢?這會因 Java 虛擬機器和 JPython 測試程序的不同而有異不過JPython 的作者已經承諾未來會做最佳化使得 JPython 的速度會和 CPython一樣快甚至更快
  
  l JPython 欠缺一些內建模塊或鏈接庫模塊比方說不能使用 ossystem() 因為這會造成 Java 和底層 OS 互動的困擾有一些 CPython 所具備的大型延伸模塊(比方說Tkinter)也在 JPython 中付之阙如因為 Java 環境原本就不具備這些工具(比方說 Tk/Tcl )
  
  
  
  透過 JPythonPython 程序員可以使用 Java 鏈接庫 JPython 可以讓 Python 程序員天衣無縫地使用 Java 鏈接庫而這是 CPython 做不到的請看下面的程序 jpythondemopy 和其執行結果
  
  
  
  
  
  
  
  from pawt import swing
  
  import java
  
  
  
  def exit(e): javalangSystemexit()
  
  
  
  frame = swingJFrame(Swing Example visible=)
  
  button = swingJButton(This is a Swinging button! actionPerformed=exit)
  
  ntentPaneadd(button)
  
  framepack()
  
  
  
  透過這個簡單的程序你可以看出寫一個用 Java Swing 來當 GUI 的 Python 程序相當簡單第一行先引入(import)Swing 的package(pawt 表示目前 Swing 模塊的所在位置可以是在 javaawtswing或 comsunjavaswing或 javaxswing)第二行引入 java package因為待會程序中會用到 javalangSystemexit()第四行建立一個 JFrame 對象並設定此 JFrame 組件的 visible 屬性為「真」第五行建立一個 JButton 對象設定其標示文字並指定按鍵被按下時必須執行的函式為 exit()最後兩行把此 JButton 對象放到 JFrame 對象中再將 JFrame 的大小調到剛好
  
  
  
  有經驗的 Java 程序員可能會對 jpythondemopy 程序中的某些部分感到有些吃驚因為它和對等的 Java 程序有些差異為了要讓 JPython 中使用 Java 鏈接庫和 CPython 中一樣簡單 JPython 在背後做了許多事比方說當 JPython 引入(import)一個 Java package 就會主動地往下追蹤適當的 package 然後透過 Java Reflection API 找出 package 的內容類別和 method 的 signatureJPython 也會實時進行 Python 和 Java 之間的型態轉換比方說在 jpythondemopy 程序中按鍵的文字「This is a Swinging example!」是 Python 的字符串在呼叫 JButton 的 constructor 之前JPython 會先找出正確的 constructor(透過參數來判斷)然後自動將 Python 的字符串轉成 Java 的字符串JPython 內部甚至用了更精巧的方式來允許你在 JButton 的 constructor 中方便地使用「actionPerformed=exit」當作參數這種作法是 Java 所沒有的因為 Java 不允許 function(或 method)當作參數在 JPython 中你不用像 Java 需要為了提供 actionPerformed method 而建立一個 ActionListener 類別(當然你也可以在 JPython 中使用 Java 的方式如果你不嫌啰唆的話)
  
  
  
  JPython as a Java Scripting Language
  
  JPython 越來越受歡迎因為它允許程序員去探究不斷出現形形色色的 Java 鏈接庫大家也發現 JPython 可以幫助在 Java 中嵌入 Python 當作描述語言(scripting language)來讓最終使用者量身打造測試或進行其它程序設計工作關於這方面更進一步的資料在 JPython 軟件的demo/embed 次目錄中有更詳細的說明
  
  
  
  一個真正的 JPython/Swing 范例grapherpy
  
  grapherpy 程序(外觀如下圖)允許使用者用圖形的方式來觀察數學函數的圖形本程序也用到 Swing GUI 套件畫面上有兩個文字字段需要填入 Python 程序在上面的字段中填入任意的Python 程序在此引入(import)所需要的模塊並定義相關函數第二個字段(標式示「Expression:」)中填入 Python 的計算式(比方說 sin(x))而非填入 Python 敘述繪圖時每個水瓶坐標 x 值都會代入此計算式
  
  
  
  
  
  
  
  使用者可以自行控制繪出的圖形是線狀圖或實心圖也可以決定繪圖點數顏色而且還可以把設定存到磁盤中下次再叫出來(透過 pickle 模塊)下面就是 grapherpy 的程序代碼
  
  
  
  from pawt import swing awt colors GridBag
  
  RIGHT = swingJLabelRIGHT
  
  APPROVE_OPTION = swingJFileChooserAPPROVE_OPTION
  
  import javaio
  
  import pickle os
  
  
  
  default_setup = from math import *def squarewave(xorder):
  
  total =
  
  for i in range( order*+ ):
  
  total = total + sin(x*i/)/(float(i))
  
  return total
  
  
  
  
  
  default_expression = squarewave(x order=) class Chart(awtCanvas):
  
  color = colorsdarkturquoise
  
  style = Filled
  
  
  
  def getPreferredSize(self):
  
  return awtDimension()
  
  
  
  def paint(self graphics):
  
  clip = selfbounds
  
  lor = colorswhite
  
  graphicsfillRect( clipwidth clipheight)
  
  
  
  
  
  width = int(clipwidth * )
  
  height = int(clipheight * )
  
  x_offset = int(clipwidth * )
  
  y_offset = clipheight int(clipheight * )
  
  
  
  N = len(selfdata); xs = []*N; ys = []*N
  
  
  
  xmin xmax = N
  
  ymax = max(selfdata)
  
  ymin = min(selfdata)
  
  
  
  zero_y = y_offset int(ymin/(ymaxymin)*height)
  
  zero_x = x_offset + int(xmin/(xmaxxmin)*width)
  
  
  
  for i in range(N):
  
  xs[i] = int(float(i)*width/N) + x_offset
  
  ys[i] = y_offset int((selfdata[i]ymin)/(ymaxymin)*height)
  
  lor = lor
  
  if selfstyle == Line:
  
  graphicsdrawPolyline(xs ys len(xs))
  
  else:
  
  xsinsert( xs[]); ysinsert( zero_y)
  
  xsappend(xs[]); ysappend(zero_y)
  
  graphicsfillPolygon(xs ys len(xs))
  
  
  
  # draw axes
  
  lor = colorsblack
  
  graphicsdrawLine(x_offsetzero_y x_offset+width zero_y)
  
  graphicsdrawLine(zero_x y_offset zero_x y_offsetheight)
  
  
  
  # draw labels leading = graphicsfontsize
  
  graphicsdrawString(%f % xmin x_offset zero_y+leading)
  
  graphicsdrawString(%f % xmax x_offset+width zero_y+leading)
  
  graphicsdrawString(%f % ymin zero_x y_offset)
  
  graphicsdrawString(%f % ymax zero_x y_offsetheight+leading)
  

From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19740.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.