用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值