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('2015-3-25')


    @log放到now()函数的定义处,相当于执行了语句:

    now = log(now)

    三层嵌套

    如果decorator本身需要传入参数,那就需要编写一个返回decorator的高阶函数,写出来会更复杂。比如,要自定义log的文本:

    def log(text):
        def decorator(func):
            def wrapper(*args, **kw):
                print('%s %s():' % (text, func.__name__))
                return func(*args, **kw)
            return wrapper
        return decorator
    

    这个3层嵌套的decorator用法如下:

    @log('execute')
    def now():
        print('2015-3-25')
    

    执行结果如下:

    >>> now()
    execute now():
    2015-3-25
    

    和两层嵌套的decorator相比,3层嵌套的效果是这样的:

    >>> now = log('execute')(now)
    

    我们来剖析上面的语句,首先执行log('execute'),返回的是decorator函数,再调用返回的decorator函数,参数是now函数,返回值最终是wrapper函数。

    以上两种decorator的定义都没有问题,但还差最后一步。因为我们讲了函数也是对象,它有__name__等属性,但你去看经过decorator装饰之后的函数,它们的__name__已经从原来的'now'变成了'wrapper'

    要理解得更细 可以看 http://www.jianshu.com/p/d68c6da1587a

  • 相关阅读:
    OAuth 2.0理论
    mvvm
    js中使用new所做的事情
    使用vue实现图片上传插件
    控制元素滚动位置
    float属性
    确定节点直接的关系
    react 开发中的问题简记
    深复制浅复制
    HTML和CSS实现常见的布局
  • 原文地址:https://www.cnblogs.com/xiangqianzou/p/7016106.html
Copyright © 2011-2022 走看看