[技術講座]
import sys from java import lang #Javaのパッケージをimport |
# My Setting (kanno) python.path=.;c:/home/kanno/jython |
def func_test(): print "test" |
例えばJythonのインタプリタ上から利用したい場合は、以下のとおり。
>>> import Sample >>> Sample.func_test() test >>> |
importされたファイルはモジュールと呼ばれます。Pythonスクリプト内では、モジュールは、まるでオブジェクトのように見えます。この例では、Sampleというオブジェクトのfunc_test()というメソッドを呼び出しているように見えますね。
モジュール内の関数を直接呼び出せるようにしたい場合は、このようになります。
>>> from Sample import func_test >>> func_test() test |
どちらかというと、前者の方が好まれる傾向があるようです。名前の衝突を防ぎ、プログラムの可読性を上げるからでしょうか。
(1)
class Person: def setName(self,name): self.name=name def getName(self): return self.name def sayHello(self): print "Hello!! MyName is" ,self.name |
class クラス名:
で始まるブロックがクラスの定義文です。もちろんインデントの終了がクラスの定義文の終了を表します。
def メソッド名(self,・・・)
で行います。メソッドの第一引数には、このオブジェクト自身selfが入ります。つまりJavaでいうthisに相当するものです。これに関しては、内部構造剥き出しという感じで、一瞬拒否反応が出そうになりますが、まぁ慣れれば平気です。。setName(self,name)
の中身を見てみると、Pythonにおけるインスタンス変数の取り扱いがわかります。規則は簡単です。つまり「インスタンス変数にアクセスする際には、必ずself.をつける」ということです。self.がついていないものは、そのクラスのインスタンス変数ではないことが一目瞭然です。このメソッドの例では、インスタンス変数self.nameとメソッドの引数nameの違いがすぐにわかりますね。getName()
のあたりを参照してください。Jython 2.1 on java1.3.0_02 (JIT: null) Type "copyright", "credits" or "license" for more information. |
>>> import sample >>> |
>>> p = sample.Person() >>> p <sample.Person instance at 3753263> |
この場合はモジュールが一種のファクトリのように見えて面白いですね。
>>> p.setName("Jython") >>> p.getName() 'Jython' >>> p.sayHello() Hello!! MyName is Jython >>> |
class Person: def __init__(self): self.name="Jython" def setName(self,name): self.name=name def getName(self): return self.name def sayHello(self): print "Hello!! MyName is" ,self.name |
ここでは、__init__(self)がコンストラクタの定義になります。
このようにPythonでは、一部の特殊なメソッドは__メソッド名__()という名前になっていて、ユーザが必要に応じてオーバーライドすることができます。
class Student(Person): def getGrade(self): return this.grade def setGrade(self, grade): self.grade=grade |
from javax import swing class PersonFrame(swing.JFrame,Person): def __init__(self): Person.__init__(self) self.label=swing.JLabel() self.getContentPane().add(self.label) self.pack() def sayHello(self): self.label.text="Hello!! MyName is" + self.name self.pack() self.show() |
>>> import sample >>> p=sample.PersonFrame() >>> p.setName("Jython") >>> p.sayHello() >>> |
小さなウィンドウが現れて挨拶をしてくれるはずです。
実は、このプログラムの例では、Jythonならではの記述を見ることができるのですが、詳しい解説は今後にとっておきます。
1,2,3,4 1,2,3,4 TEST,TEST,TEST,TEST |
1 | 2 | 3 | 4 |
1 | 2 | 3 | 4 |
TEST | TEST | TEST | TEST |
<table > <tr> <td>TEST</td> <td>TEST</td> </tr> <tr> <td>TEST</td> <td>TEST</td> </tr> </table> |
from java import lang from java import io # テーブルクラス class Table: def __init__(self): self.rowList = [] def toHTML(self): lang.System.out.println("<table>") for i in self.rowList: i.toHTML() lang.System.out.println("</table>") def addRow(self,row): self.rowList.append(row) return self # 行クラス class Row: def __init__(self): self.cellList=[] def addCell(self,cell): self.cellList.append(cell) return self def toHTML(self): lang.System.out.println(" <tr>") for i in self.cellList: i.toHTML() lang.System.out.println(" </tr>") # Cellクラス class Cell: def __init__(self,content): self.content=content def toHTML(self): lang.System.out.println(" <td>"+self.content+"</td>") |
Tableの構造を、スクリプト内で組み立てて、出力する部分までテストします。
CSVの事は考えずに、直接スクリプト内でテーブルを組み立て、出力をチェックします。
import Table if __name__ == '__main__': table=Table.Table() row1=Table.Row() row2=Table.Row() cell_1_1=Table.Cell("TEST") cell_1_2=Table.Cell("TEST") cell_2_1=Table.Cell("TEST") cell_2_2=Table.Cell("TEST") table.addRow(row1) row1.addCell(cell_1_1) \ .addCell(cell_1_2) table.addRow(row2) row2.addCell(cell_2_1) \ .addCell(cell_2_2) table.toHTML() |
>jython testTable.py <table > <tr> <td>TEST</td> <td>TEST</td> </tr> <tr> <td>TEST</td> <td>TEST</td> </tr> </table> |
from java import lang from java import io import Table class CSVReader(io.BufferedReader): def __init__(self,reader): io.BufferedReader.__init__(self,reader) #スーパクラスのコンストラクタ self.rows = [] def readRow(self): # 行を読み取り解析 Row(とCell)を作成する rowString = io.BufferedReader.readLine(self) # javaでいうsuper.readLine() if (rowString==None): return None rowData = Table.Row() contentList = rowString.split(",") for content in contentList: rowData.addCell(Table.Cell(content)) return rowData |
from java import lang from java import io import Table import CSVReader if __name__ == '__main__': sample = CSVReader.CSVReader(io.FileReader("test.csv")) table = Table.Table() row = sample.readRow() while(row): table.addRow(row) row = sample.readRow() table.toHTML() |
HTMLを生成する部分がTable,Row,Cellクラスに直に記述してあるところなど、不満点は多いですが、最初に考えた仕様はとりあえず満たしたようです。これを叩き台に洗練させていくことも可能です。
© 2002 OGIS-RI Co., Ltd. |
|