{"id":121,"date":"2007-11-11T15:46:12","date_gmt":"2007-11-11T15:46:12","guid":{"rendered":"http:\/\/byteblog.internetallee.de\/?p=121"},"modified":"2007-11-11T15:46:12","modified_gmt":"2007-11-11T15:46:12","slug":"dekoratoren-in-python","status":"publish","type":"post","link":"https:\/\/blogs.internetallee.de\/byteblog\/2007\/11\/11\/dekoratoren-in-python\/","title":{"rendered":"Dekoratoren in Python"},"content":{"rendered":"<p>In Java ein alter Hut. In Python ebenso.<\/p>\n<p>In TurboGears bin ich \u00fcber die folgende Syntax gestolpert:<\/p>\n<pre class=\"brush: python;\">@exposes('template.html')\ndef f(): pass\n<\/pre>\n<p>In der Doku steht dann, das <code>@exposes<\/code> die Methode <code>f()<\/code> dekoriert. Diese Art der Dekorierung ist mit Python 2.4 neu dazu gekommen und erm\u00f6glicht es eine Methode um weitere Funktionalit\u00e4t zu erweitern. Es ist sehr einfach m\u00f6glich selber solche Dekorierer zu erstellen.<\/p>\n<p>Dazu muss nur eine Funktion mit dem Namen des Dekorators (in unserem Falle <code>exposes<\/code>) erstellt werden. Diese Funktion erh\u00e4lt ein Argument, die zu dekorierende Funktion. Diese Funktion kann dann nach belieben weiterverarbeitet werden und wird zum Schluss zur\u00fcckgegeben. Ein einfaches Beispiel w\u00e4re also:<\/p>\n<pre class=\"brush: python;\">&gt;&gt;&gt; def exposes(func):\n...\tfunc.decorated=True\n...\treturn func\n...\n&gt;&gt;&gt; @exposes\n... def f(): pass\n...\n&gt;&gt;&gt; print f.decorated\nTrue\n<\/pre>\n<p>Im Beispiel aus TurboGears erh\u00e4lt der Dekorator allerdings noch einen Parameter. Dekoratoren mit Parametern m\u00fcssen einen Dekorator zur\u00fcckliefern, der nur die zu dekorierende Funktion annimmt. Alles klar? Also zum Beispiel:<\/p>\n<pre class=\"brush: python;\">&gt;&gt;&gt; def exposes(template='default.html'):\n...\tdef newDeco(func):\n...\t\tfunc.template=template\n...\t\treturn func\n...\treturn newDeco\n...\n&gt;&gt;&gt; @exposes()\n... def f(): pass\n...\n&gt;&gt;&gt; print f.template\n'default.html'\n<\/pre>\n<p>Bei TurboGears passiert bei den Dekoratoren noch eine Menge mehr, so wird die dekorierte Funktion wirklich eingepackt, aber zum Verst\u00e4ndnis von Dekoratoren sollte das obige erstmal ausreichen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In Java ein alter Hut. In Python ebenso. In TurboGears bin ich \u00fcber die folgende Syntax gestolpert: @exposes(&#8218;template.html&#8216;) 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\u00f6glicht es eine Methode um weitere Funktionalit\u00e4t zu erweitern. Es ist [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[21,27],"class_list":["post-121","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-python","tag-sprachen"],"_links":{"self":[{"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/posts\/121","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/comments?post=121"}],"version-history":[{"count":0,"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/posts\/121\/revisions"}],"wp:attachment":[{"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/media?parent=121"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/categories?post=121"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/tags?post=121"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}