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!
  • 相关阅读:
    蟠桃记
    考新郎
    有假币
    年会抽奖
    发邮件
    进制回文数
    数位和
    外星人的语言
    一的个数
    继承
  • 原文地址:https://www.cnblogs.com/roronoa-sqd/p/4899284.html
Copyright © 2011-2022 走看看