Yogi hat geschrieben:Und zwar definieren letztere statische Methoden mit @staticmethod vor der Methode und in seinem Buch werden die einfach nur mit staticmethod(Methodenname) aufgerufen
http://www.python.org/dev/peps/pep-0318/
http://www.python.org/doc/2.4/whatsnew/whatsnew24.html
http://wiki.python.org/moin/FrontPage?a ... arch=Titel
Da ich kein Java-Programmierer bin und daher nicht weiß ob es in Java First-Class-Functions und closures gibt (darauf basiert halt das ganze), schreibe ich das folgende.
mit ``@`` Dekoriert man Funktionen und Methoden. Dieses Future wurde in Python 2.4 eingeführt, weil, IMHO, die Python Programmierer angefangen haben immer mehr Funktionen zu schreiben die als Decorator eingesetzt wurden.
Dekoratoren werden definiert, in dem der äußeren Funktion eine inner definiert wird, die beim aufruft der äußeren zurückgegeben wird. Stichwort
closures
Code: Alles auswählen
def mydeco(f):
def inner(*args, **kwargs):
print "args: %r; kwargs: %r" % (args, kwargs)
return f(*args, **kwargs)
return inner
@mydeco
def my_func1(a, b=2):
return a * b
print my_func1(2)
Dabei ist
äquivalent mit
Code: Alles auswählen
def my_func1(a, b=2):
return a * b
my_func1 = mydeco(my_func1)
``@`` ist also nur syntaktischer Zucker, um das Dekorieren näher an die Funktionsdefinition zu "Binden".
So, dann gibt es noch folgenden Form, die es zulässt dem Decorator Argumente zu übergeben:
Code: Alles auswählen
def mydeco(counts):
assert not hasattr(counts, "__call__")
def inner(f):
def inner_inner(*args, **kwargs):
print "args: %r; kwargs: %r, counts: %r" % (args, kwargs, counts)
return f(*args, **kwargs)
return inner_inner
return inner
@mydeco(100)
def my_func1(a, b=2):
return a * b
print my_func1(2, b=3)
Dies ist äquivalent mit der hässlichen Variante
Code: Alles auswählen
def my_func1(a, b=2):
return a * b
my_func1 = mydeco(100)(my_func1)
Dann gibt es noch Deskriptoren (``property`` und ``classmethod`` sind sogenannte Deskriptoren), die man dann auch als Decorator benutzen kann.
Zum Thema descriptors:
http://docs.python.org/ref/descriptors.html
http://www.python.org/doc/2.2.3/whatsne ... 0000000000
http://users.rcn.com/python/download/Descriptor.htm
http://gulopine.gamemusic.org/2007/nov/ ... rt-1-of-2/
Yogi hat geschrieben:Kann ja sein, dass das alles schon vorher drinne war, aber wenn ich als Neueinsteiger einen Titel vorliegen habe, der sich 'praktische Referenz' nennt, dann gehe ich erst einmal davon aus, dass alles wesentliche enthalten ist.
Darauf kannst du dich aber nicht verlassen. Bücher veralten schneller als man denkt und die Online-Dokumentation ist immer up2date.
EDIT:
Klassen kann man momentan nicht mit ``@`` dekorieren (Da muss man ahlt mit der gewöhnlichen Syntax leben). Class-Decorators mit ``@`` wird es aber in Py3K geben, worauf ich mich schon richtig freue