Browse Source

better decorator example

Sakis Kasampalis 11 years ago
parent
commit
aedcee1262
1 changed files with 19 additions and 49 deletions
  1. 19 49
      decorator.py

+ 19 - 49
decorator.py

@@ -1,55 +1,25 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
+'''https://docs.python.org/2/library/functools.html#functools.wraps'''
+'''https://stackoverflow.com/questions/739654/how-can-i-make-a-chain-of-function-decorators-in-python/739665#739665'''
 
-"""http://stackoverflow.com/questions/3118929/implementing-the-decorator-pattern-in-python"""
+from functools import wraps
 
+def makebold(fn):
+    @wraps(fn)
+    def wrapped():
+        return "<b>" + fn() + "</b>"
+    return wrapped
 
-class foo_decorator(object):
+def makeitalic(fn):
+    @wraps(fn)
+    def wrapped():
+        return "<i>" + fn() + "</i>"
+    return wrapped
 
-    def __init__(self, decoratee):
-        self._decoratee = decoratee
-
-    def f1(self):
-        print("decorated f1")
-        self._decoratee.f1()
-
-    def __getattr__(self, name):
-        return getattr(self._decoratee, name)
-
-
-class undecorated_foo(object):
-
-    def f1(self):
-        print("original f1")
-
-    def f2(self):
-        print("original f2")
-
-
-@foo_decorator
-class decorated_foo(object):
-
-    def f1(self):
-        print("original f1")
-
-    def f2(self):
-        print("original f2")
-
-
-def main():
-    u = undecorated_foo()
-    v = foo_decorator(u)
-    # The @foo_decorator syntax is just shorthand for calling
-    # foo_decorator on the decorated object right after its
-    # declaration.
-
-    v.f1()
-    v.f2()
+@makebold
+@makeitalic
+def hello():
+    '''a decorated hello world'''
+    return "hello world"
 
 if __name__ == '__main__':
-    main()
-
-### OUTPUT ###
-# decorated f1
-# original f1
-# original f2
+    print('result:{}   name:{}   doc:{}'.format(hello(), hello.__name__, hello.__doc__))