1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| strOldFunctionName = ""; strNewFunctionName = ""; #装饰器有参数: def decorator(name): #装饰器函数,参数name可以作为关键字使用(可选的特点); def wrapper(callback): #内嵌一级闭包函数wrapper(),用于传递目标函数对象;接受一个函数对象作为参数(这个函数一般就是目标函数); #目标有参数: def _wrapper(*args, **kwargs): #二级闭包函数_wrapper()用于传递目标函数的所有参数; strOldFunctionName = callback.__name__; print "装饰前的函数名: %s" % strOldFunctionName; print "{name}: enter {func}()".format(name = name, func = callback.__name__); #打印输出:通过关键字模式"{name}"打印,关键字name与format()的name关键字参数相同,func雷同; callback(*args, **kwargs); #调用目标函数,执行原有功能; print "{name}: leave {func}!".format(name = name, func = callback.__name__); #打印输出:通过关键字模式"{name}"打印,关键字name与format()的name关键字参数相同,func雷同; pass; return _wrapper; #在一级闭包函数中返回二级闭包函数对象; return wrapper; #在装饰器函数中返回一级闭包函数对象; #装饰器有参数: @decorator(name = 'SYSTEM') #装饰目标函数,参数name被用作关键字参数传递(可选参数的特点); def target3(a, b, c): strNewFunctionName = target3.__name__; print "装饰后的函数名target = %s" % strNewFunctionName; print "a = %d, b = %d, c = %d" % (a, b, c); pass; #装饰器有参数: @decorator('PROCESS') #装饰目标函数,参数name没有被用作关键字参数传递; def target2(x, y): strNewFunctionName = target2.__name__; print "装饰后的函数名target = %s" % strNewFunctionName; print "x = %d, y = %d" % (x, y); pass; target2(6, 8); #调用装饰过的新函数; target3(4, 6, 8); #调用装饰过的新函数;
|