zoukankan      html  css  js  c++  java
  • Python -- 装饰器

    在代码运行期间动态增加函数功能的方式,称之为“装饰器”(Decorator)。

    def log(func):
        def wrapper(*args, **kw):
            print 'call %s():' % func.__name__
            return func(*args, **kw)
        return wrapper
    
    @log
    def now():
        print '2013-12-25'
    def log(text):    #带参数版装饰器
        def decorator(func):
            def wrapper(*args, **kw):
                print '%s %s():' % (text, func.__name__)
                return func(*args, **kw)
            return wrapper
        return decorator

    完整版

    import functools
    
    def log(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            print 'call %s():' % func.__name__
            return func(*args, **kw)
        return wrapper

    #functools的作用:把原始函数的__name__等属性复制到wrapper()函数中

    也可以给一个函数添加多个装饰器

    def memorize(f):
        cache = {}
        def helper(x):
            if x not in cache:
                cache[x] = f(x)
            return cache[x]
        return helper
    
    def trace(f):
        def helper(x):
            call_str = "{0}({1})".format(f.__name__, x)
            print("Calling %s..." % call_str)
            result = f(x)
            print("...returning from %s = %s" % (call_str, result))
            return result
        return helper
        
        
        
    @memorize
    @trace
    def fib(n):
        if n in (0,1):
            return 1
        else:
            return fib(n-2)+fib(n-1)
    
            
    fib(5)
    KEEP LEARNING!
  • 相关阅读:
    arcEngine classic code(2)
    VisualGraph文档
    基于.net2 的CAD 绘图控件virtualGraph(2)
    沈阳三维GIS软件开发人员
    arcEngine + .net 2 AccessViolationException
    数据库事务并发带来的问题
    理解 WPF Dispatcher
    扇入与扇出
    IComparable 与 IComparer
    同步、异步、多线程
  • 原文地址:https://www.cnblogs.com/roronoa-sqd/p/4899284.html
Copyright © 2011-2022 走看看