Pyhton*之路(六)闭包与装饰器

设计模式中有一种叫做装饰者模式,而在JAVA社区中,有一种技术被称之为AOP。
个人理解为,在某一过程运行时程序能动态地控制过程的行为。可惜目前的我离这个目标还有段距离,只能通过反射机制动态控制过程的始末。
 来看一个简单的例子:
 def test(sec):
      print 'please wait',
      for i in range(sec):
          sleep(1)
          print '.',       
      print 'over~!'
这是一个简单的过程,现在要在这个过程的前后加上时间日志。我们定义一个日志记录函数
 def log(func):
      def wrapperfunc(*args):
         print 'Function Runing..at',ctime()
         func(*args)
         print 'Function Finished..at',ctime()
      return wrapperfunc
在程序中测试方法def test(sec)上面加上’@log’,再次运行调用test(3),可以发现python中利用闭包实现AOP是多么简洁优雅。关于(*args)请参考API中“可变长度的参数”
你也可以使用带参数的函数修饰符’@log(who,when)’来动态决定使用怎样的装饰规则。
看下面的例子:
Pyhton*之路(六)闭包与装饰器Pyhton*之路(六)闭包与装饰器Code
def log(who,when):
    
def logged(f):
        
def wrapperfunc(*args):
            
print 'Function Runing..at',when
            f(
*args)
            
print 'Function Finished..at',ctime()
        
return wrapperfunc
    
    
def welcome(func):
        
def wrapperHello(*args):
            
print 'Hello',who,',welcome accessing'
            func(
*args)
            
print 'Goog Bye,',who
        
return wrapperHello
 
    
if who =='' :
        
return logged
    
else:
        
return welcome
@log(
'ysisl',ctime())
def test(sec):
    
print 'please wait',
    
for i in range(sec):
        sleep(
1)
        
print '.',        
 
print 'over!'
如果运用得当,这样的功能可以给我们的程序带来很强的可扩展性。顺便说一下,可以把log等这些装饰者函数放在其他模块的类中,我们导入模块from _module import _class,然后在要装饰的函数上加上’@_class.log’,能够这样使用的前提是log函数必须在类中声明为静态函数,即在log()也加上修饰符’@staticmethod’,从这也可以看出,函数修饰是可以迭加的。
上一篇:Python--*之路(二)Unittest Framework


下一篇:Python*之路(四)变量作用域