您所在的位置:小祥子 » 编程 » Python » 正文

Python实现__metaclass__实现方法运行时间统计

时间:2015-04-18 编辑:cncyber 来源:本站整理
#coding:utf-8
import sys,os,time,types,functools

#装饰器,包裹被检测函数,并计数
def timerit(func):
    @functools.wraps(func)
    def wrapper(*args,**kw):
        start=time.time()
        value=func(*args,**kw)
        end=time.time()
        print("%suse time is %s"%(func.__name__,end-start))
        return value
    return wrapper
#元类,被计数的函数__metaclass__指向这个函数
class profiler(type):
    def __new__(cls,name,base,attr):
        print('__new__ is called')
        #遍历被计数类的属性,如果是FunctionType则用计数装饰器包裹它
        for k,v in attr.items():
            if isinstance(v,types.FunctionType):
                attr[k]=timerit(v)
        return type.__new__(cls,name,base,attr)
class foo(metaclass=profiler):
    __metaclass__=profiler
    #这个地方有一个疑问,
    def countit(*args):
        sum=0
        for i in range(10000):
            sum=sum+i
        print(sum)


def main():
    import time
    print(time.time())
    print(hasattr(profiler,'timeit'))
    f=foo()
    f.countit()
    print(dir(f))
    print(f.__metaclass__)
    

if __name__=="__main__":
    main()
View Code


几天前写的,参考了园友的一篇文章,链接找不到了。先感谢,找到了链接再补上。