Um die Klassedefinition in Jython zu verstehen, schauen Sie sich das Beispielprogramm, mit dem Faktor berechnet werden kann (factorial.py).
Sie können hier viele Sparchmerkmale von Jython erkennen. Als erstes werden die Kommentarzeilen mit einem Doppelkreuz-Zeichen (#) eingeleitet. Eine Klasse oder Methode kann darüber hinaus ein Kommentar enthalten, das durch ein Dokumentationstool - wie JavaDoc - verarbeitet werden kann. Ein Beispiel dafür sehen Sie in der zweiten Zeile. Ein Statement stellt entweder eine Wertzuweisung dar oder fängt mit einem Schlüsselwort an. Klassen und Methoden sind nicht durch die Klammer begrenzt, sie werden dagegen entsprechend eingerückt.
class Factorial:
''' A factorial calculator '''
seen = {} # cache of prior calculated values
def __init__ (self, value):
self.__value = value
def compute (self, value=None):
''' calculate the result '''
if value is None: value = self.__value # default
if value < 0: # bad arg!
raise ValueError, 'arg < 0'
elif value < 2: # base case
return 1L # insure long integers are used
else: # need to calculate
if not value in Factorial.seen.keys(): # not done before?
# calculate this value and cache it
Factorial.seen[value] = value * /
Factorial(value - 1).compute()
return Factorial.seen[value] # get value from the cache
Die Klassen werden mit dem Schlüsselwort class deklariert. Mit einem weiteren Schlüsselwort def werden die Methoden eingeleitet. Klassenattribute deklariert und initialisiert man in dem Konstruktor-Method __init__. Die Variable seen ist vom Typ dictionary. Die Objekte werden durch den Aufruf der Funktion mit dem Klassennamen instantiiert. Die Klassenmethoden sind (wie in Java) mit einem Punkt (.) vom entsprechenden Objektnamen getrennt.
Achten Sie darauf, dass die Variable self eine Referenz auf sich selbst (ähnlich this in Java) enthält. Die Klassevariablen erkennt man an dem Namen des Objektes davor.
Die Funktionen können Defaultwerte für Parameter haben, wie Sie in der Funktion compute() sehen können. Wenn der Parameter ausgelassen wird, dann Wird die Klassenvariable __value genutzt.
An diesem Punkt ist es klar, dass Jython alle Merkmale einer objektorientierten Sprache wie Java hat, wenn auch in manchen Fällen einen eigenen Syntax dafür verwendet. Zum Beispiel, raise-Befehl in Jython verhält sich ähnlich der Anweisung throw in Java.
Sie können das Beispielprogramm mit dem folgendem Code testen:
if __name__ == "__main__":
from sys import argv
if len(argv) == 1: vals = range(10)
elif len(argv) == 2: vals = range(int(argv[1]))
elif len(argv) == 3: vals = range(int(argv[1]), int(argv[2]))
else: print " Incorrect range"; vals = ()
for i in vals:
print "Factorial(%i)=%i" % (i, Factorial(i).compute())
print "Cache:", Factorial.seen
In Jython kann sowie Klassendefinition als auch ausführbarer Testcode in einer Quelldatei kombiniert werden. Die Anweisung if __name__ erlaubt die Ausführung des Code nur, wenn das Programm in der Konsole aufrerufen wurde. Diesselbe Datei kann aber durch eine andere Klasse importiert werden - um z.B. die Klasse Factorial abzuleiten - ohne dass dieser Testcode dabei ausgeführt wird. Der Testcode besteht aus einigen einfachen Aufrufen und einer anschliessenden Schleife, die den Faktor der übergebenen Werte berechnet. Am Ende wird noch der Inhalte von Cache ausgegeben. Mit dem Befehl jython factorial.py 5 10 erzeugt das Programm folgende Ausgabe:
Factorial(5)=120
Factorial(6)=720
Factorial(7)=5040
Factorial(8)=40320
Factorial(9)=362880
Cache: {9: 362880L, 8: 40320L, 7: 5040L, 6: 720L, 5: 120L, 4: 24L, 3: 6L, 2: 2L}
Im Cache werden in diesem Fall keine Integer-Werte gespeichert, da die Werte nicht begrenzt und durch den Jython Datentyp long (###L) definiert werden.