Etwas wie Apache Wicket könnte sich in Python so anfühlen.
Wir bauen ein Gästebuch, eine Webseite, auf der Leute Kommentare hinterlassen können.
Dies ist so ein Kommentar:
Code: Alles auswählen
class Comment(object):
def __init__(self, text=""):
self.text = text
self.date = datetime.now()
Dies ist die Webseite. Sie ist eine Komponente und besteht aus weiteren Komponenten. Jede Komponente wird als Klasse realisiert:
Code: Alles auswählen
class GuestBook(web.Page):
comments = [] # database
def __init__(self):
self.add(self.CommentForm("form"))
self.add(self.CommentListView("comments", self.comments))
class CommentForm(web.Form):
def __init__(self, name):
web.Form.__init__(self, name)
self.comment = Comment()
self.add(web.TextArea("text", web.PropertyModel(self.comment, "text")))
def on_submit(self):
GuestBook.comments.append(Comment(self.comment.text))
self.page.comments.model_changed()
self.comment.text = ""
class CommentListView(web.ListView):
def __init__(self, name, model):
web.ListView.__init__(self, name, model)
def populate_item(self, item):
comment = item.model_object
item.add(web.Label("date", comment.date))
item.add(web.MultiLineLabel("text", comment.text))
Dazu kommt ein Template, das über die "wicket:id"-Marker an die Komponenten gebunden wird:
Code: Alles auswählen
<html><body>
<form wicket:id="form">
<textarea wicket:id="text">...</textarea>
<input type="submit"/>
</form>
<div wicket:id="comments">
<p><span wicket:id="date">1.1.2004</span><br/><span wicket:id="text">...</span></p>
</div>
</body></html>
Nun braucht man noch etwas, das alles zusammenhält:
Code: Alles auswählen
class GuestBookApplication(web.Application):
home_page = GuestBook
Meine direkte Translation von Java fühlt sich in Python noch etwas hölzern an. Wicket-Code wimmelt von inneren Klassen und impliziten Zuweisungen. Für Python musste ich beide Komponenten-Klassen explizit machen. Und es wimmelt dort nun von "self"s. Implizite Zuweisungen gibt es in Python nicht, an einer Stelle habe ich daher angenommen, dass ich mit ".comments" auf eine unter dem Namen "comments" hinzugefügte Komponente zugreifen kann. Und offenbar kommen alle Klassen des Rahmenwerks aus dem Modul "web".
Stefan