標籤:
#coding:utf-8import 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
幾天前寫的,參考了園友的一篇文章,連結找不到了。先感謝,找到了連結再補上。
Python實現__metaclass__實現方法已耗用時間統計