-
#!/usr/bin/env python
-
#coding=utf8
-
import sys
-
-
def deco(func):
-
print("before %s() called on %s." % (func, sys._getframe().f_code.co_name))
-
func()
-
print("after %s() called on %s." % (func, sys._getframe().f_code.co_name))
-
return func
-
-
def deco_at_one(func):
-
print("before %s() called on %s." % (func, sys._getframe().f_code.co_name))
-
func()
-
print("after %s() called on %s." % (func, sys._getframe().f_code.co_name))
-
return func
-
-
def deco_at_inline_noparams(func):
-
def _deco_inline():
-
print("before %s() called on %s." % (func, sys._getframe().f_code.co_name))
-
res = func()
-
print("after %s() called on %s." % (func, sys._getframe().f_code.co_name))
-
return res
-
return _deco_inline
-
-
def deco_at_inline_params_fix(func):
-
def _deco_inline_params_fix(a, b):
-
print("before %s() called on %s." % (func, sys._getframe().f_code.co_name))
-
res = func(a, b)
-
print("after %s() called on %s." % (func, sys._getframe().f_code.co_name))
-
return res
-
return _deco_inline_params_fix
-
-
def deco_at_inline_params_unfix(func):
-
def _deco_at_inline_params_unfix(*args, **kwargs):
-
print("before %s() called on %s." % (func, sys._getframe().f_code.co_name))
-
res = func(*args, **kwargs)
-
print("after %s() called on %s." % (func, sys._getframe().f_code.co_name))
-
return res
-
return _deco_at_inline_params_unfix
-
-
def deco_at_inline_params_unfix_withparams(dcargs):
-
def _deco_at_inline_params_unfix_wp(func):
-
def __deco_at_inline_params_unfix_wp(*args, **kwargs):
-
print("before %s() called on %s(%s)." % (func, sys._getframe().f_code.co_name, dcargs))
-
res = func(*args, **kwargs)
-
print("after %s() called on %s(%s)." % (func, sys._getframe().f_code.co_name, dcargs))
-
return res
-
return __deco_at_inline_params_unfix_wp
-
return _deco_at_inline_params_unfix_wp
-
-
-
def deco_at_inline_params_unfix_wp_cls(dc_cls):
-
# dc_cls must implement static method function 'fn_sm_1' and 'fn_sm_2'
-
# see 'locker' module
-
def _deco_at_inline_params_unfix_wp_cls(func):
-
def __deco_at_inline_params_unfix_wp_cls(*args, **kwargs):
-
print("before %s() called on %s(%s)." % (func, sys._getframe().f_code.co_name, dc_cls))
-
dc_cls.fn_sm_1()
-
res = func(*args, **kwargs)
-
dc_cls.fn_sm_2()
-
print("after %s() called on %s." % (func, sys._getframe().f_code.co_name))
-
return res
-
return __deco_at_inline_params_unfix_wp_cls
-
return _deco_at_inline_params_unfix_wp_cls
-
-
class Class_Deco():
-
def __init__(self):
-
print("INIT deco class." )
-
-
@staticmethod
-
def fn_sm_1():
-
print(" call %s." % (sys._getframe().f_code.co_name))
-
-
@staticmethod
-
def fn_sm_2():
-
print(" call %s." % (sys._getframe().f_code.co_name))
-
-
'''
-
-------------------------------------------------------------------------------------------------------------------
-
'''
-
def fn():
-
print("%s() called." % (sys._getframe().f_code.co_name))
-
return 'ok'
-
-
def fn_deco():
-
print("%s() called." % (sys._getframe().f_code.co_name))
-
return 'ok'
-
-
'''
-
decorator function 'deco_at_one' called only one time before 'main'
-
decorator function 'deco_at_one' not called when per time call 'fn_at_deco_one'
-
'''
-
@deco_at_one
-
def fn_at_deco_one():
-
print("%s() called." % (sys._getframe().f_code.co_name))
-
return 'ok'
-
-
'''
-
decorator function 'deco_at_inline_noparams' called when per time call 'fn_at_deco_inline'
-
'''
-
@deco_at_inline_noparams
-
def fn_at_deco_inline_noparams():
-
print("%s() called." % (sys._getframe().f_code.co_name))
-
return 'ok'
-
-
'''
-
params samed between '_deco_inline_params_fix' and 'fn_at_deco_inline'
-
'''
-
@deco_at_inline_params_fix
-
def fn_at_deco_inline_params_fix(a,b):
-
print("%s() called." % (sys._getframe().f_code.co_name))
-
return a+ b
-
-
'''
-
'deco_at_inline_params_unfix' any params
-
'''
-
@deco_at_inline_params_unfix
-
def fn_at_deco_inline_params_unfix_2(a,b):
-
print("%s() called." % (sys._getframe().f_code.co_name))
-
return a+ b
-
-
'''
-
'deco_at_inline_params_unfix' any params
-
'''
-
@deco_at_inline_params_unfix
-
def fn_at_deco_inline_params_unfix_3(a,b,c):
-
print("%s() called." % (sys._getframe().f_code.co_name))
-
return a + b + c
-
-
'''
-
function 'deco_at_inline_params_unfix_withparams' can input params
-
'''
-
@deco_at_inline_params_unfix_withparams("wpa")
-
def fn_at_deco_inline_params_unfix_wp_a(a,b,c):
-
print("%s() called." % (sys._getframe().f_code.co_name))
-
return a + b + c
-
-
@deco_at_inline_params_unfix_withparams("wpb")
-
def fn_at_deco_inline_params_unfix_wp_b(a,b,c):
-
print("%s() called." % (sys._getframe().f_code.co_name))
-
return a + b * c
-
-
@deco_at_inline_params_unfix_wp_cls(Class_Deco)
-
def fn_at_deco_inline_params_unfix_wp_cls():
-
print("%s() called." % (sys._getframe().f_code.co_name))
-
return 'ok'
-
-
'''
-
execute order by @deco_[1,2,3]
-
@deco_1
-
@deco_2
-
@deco_3
-
def fn():
-
pass
-
-
'''
-
@deco_at_inline_noparams
-
@deco_at_inline_params_unfix_withparams("wpc")
-
@deco_at_inline_params_unfix_wp_cls(Class_Deco)
-
def fn_at_deco_inline_mix():
-
print("%s() called." % (sys._getframe().f_code.co_name))
-
return 'ok'
-
-
if __name__ == '__main__':
-
lin = " - " * 30
-
-
print lin
-
fna = fn()
-
-
print lin
-
fnb = deco(fn_deco)
-
-
print lin
-
fnc = fn_at_deco_one()
-
fnc = fn_at_deco_one()
-
-
print lin
-
fnd = fn_at_deco_inline_noparams()
-
fnd = fn_at_deco_inline_noparams()
-
-
print lin
-
a=2
-
b=3
-
fne = fn_at_deco_inline_params_fix(a,b)
-
print a,b,fne
-
-
a=12
-
b=32
-
fne = fn_at_deco_inline_params_fix(a,b)
-
print a,b,fne
-
-
print lin
-
a=2
-
b=3
-
fnf = fn_at_deco_inline_params_unfix_2(a,b)
-
print a,b,fnf
-
-
a=2
-
b=3
-
c=5
-
fnf = fn_at_deco_inline_params_unfix_3(a,b,c)
-
print a,b,c,fnf
-
-
print lin
-
fng = fn_at_deco_inline_params_unfix_wp_a(a,b,c)
-
print a,b,c,fng
-
fng = fn_at_deco_inline_params_unfix_wp_b(a,b,c)
-
print a,b,c,fng
-
-
print lin
-
fng = fn_at_deco_inline_params_unfix_wp_cls()
-
-
print lin
-
fnh = fn_at_deco_inline_mix()
-
-
exit(0)
参考 : http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html
其他参考资料
1. Python装饰器学习 http://blog.csdn.net/thy38/article/details/4471421
2. Python装饰器与面向切面编程 http://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html
3. Python装饰器的理解 http://apps.hi.baidu.com/share/detail/17572338
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26250550/viewspace-1816298/
,如需转载,请注明出处,否则将追究法律责任。