In Java ein alter Hut. In Python ebenso.
In TurboGears bin ich über die folgende Syntax gestolpert:
@exposes('template.html')
def f(): pass
In der Doku steht dann, das @exposes
die Methode f()
dekoriert. Diese Art der Dekorierung ist mit Python 2.4 neu dazu gekommen und ermöglicht es eine Methode um weitere Funktionalität zu erweitern. Es ist sehr einfach möglich selber solche Dekorierer zu erstellen.
Dazu muss nur eine Funktion mit dem Namen des Dekorators (in unserem Falle exposes
) erstellt werden. Diese Funktion erhält ein Argument, die zu dekorierende Funktion. Diese Funktion kann dann nach belieben weiterverarbeitet werden und wird zum Schluss zurückgegeben. Ein einfaches Beispiel wäre also:
>>> def exposes(func):
... func.decorated=True
... return func
...
>>> @exposes
... def f(): pass
...
>>> print f.decorated
True
Im Beispiel aus TurboGears erhält der Dekorator allerdings noch einen Parameter. Dekoratoren mit Parametern müssen einen Dekorator zurückliefern, der nur die zu dekorierende Funktion annimmt. Alles klar? Also zum Beispiel:
>>> def exposes(template='default.html'):
... def newDeco(func):
... func.template=template
... return func
... return newDeco
...
>>> @exposes()
... def f(): pass
...
>>> print f.template
'default.html'
Bei TurboGears passiert bei den Dekoratoren noch eine Menge mehr, so wird die dekorierte Funktion wirklich eingepackt, aber zum Verständnis von Dekoratoren sollte das obige erstmal ausreichen.