[技術講座]
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. |
|