|
@@ -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__))
|