用metaclass实现AOP风格的Profiler

以下是一段通过metaclass实现Profiler的Python代码,很简单,功能不多,目的是为了展示Python的meta programming的能力,这种能力,无疑是很实用的,而且可以将AOP的方面(aspect)概念发挥的很好!下面的Profiler类(metaclass)就可以将方法的profiling在不同的类中复用。

class  Profiler(type):
    
def   __new__ (mcl, name, bases, dict):
        
from  time  import  clock
        
from  types  import  FunctionType

        
def  timing(func):
            
def  wrapper( * args,  ** kwds):
                start 
=  clock()
                value 
=  func( * args,  ** kwds)
                end 
=  clock()
                
print  func. __name__ ' takes ' , (end  -  start),  ' seconds '
                
return  value
            
return  wrapper

        
for  attr, value  in  dict.iteritems():
            
if  isinstance(value, FunctionType):
                dict[attr] 
=  timing(value)

        
return  super(Profiler, mcl). __new__ (mcl, name, bases, dict)

class  A(object):
    
__metaclass__   =  Profiler

    
def  foo(self):
        total 
=  0
        
for  i  in  range( 100000 ):
            total 
=  total + 1
        
print  total

    
def  foo2(self):
        
from  time  import  sleep

        total 
=  0
        
for  i  in  range( 100000 ):
            total 
=  total + 1
            sleep(
0.0001 )
        
print  total

def  main():
    a 
=  A()
    a.foo()
    a.foo2()

if   __name__   ==   ' __main__ ' :
    main()


此篇为抛砖引玉,希望大家能制作出更多更强的metaclass来,然后不妨与我们分享!:)

转载于:https://www.cnblogs.com/cavingdeep/archive/2006/08/22/483056.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值