用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()

轉自:http://www.cnblogs.com/cavingdeep/archive/2006/08/22/483056.html
發佈了79 篇原創文章 · 獲贊 38 · 訪問量 144萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章