zoukankan      html  css  js  c++  java
  • 4.4、装饰器

    def log(func):
        def wrapper(*args,**kw):
            print('call %s():'%func.__name__)             
            return func(*args,**kw)                     
        return wrapper
     
    @log                              #相当于new=log(new)
    def now():
        print('2015-3-25')
    
    now()
    call now():
    2015-3-25

    由于log()是一个decorator,返回一个函数,所以,原来的now()函数仍然存在,只是现在同名的now变量指向了新的函数,于是调用now()将执行新函数,即在log()函数中返回的wrapper()函数

    如果decorator本身需要传入参数,那就需要编写一个返回decorator的高阶函数

    def log(t):
        def decorator(func):                                   #参数是new()函数
            def wrapper(*args,**kw):                           #传入now()的参数
                print('%s %s():'%(t,func.__name__))            #打印now()函数的名字
                return func(*args,**kw)                        #执行now()函数
            return wrapper
        return decorator

    @log('T')                                                 #相当于new=log('execute')(now)
    def now():
       print('2015-3-25')

    首先执行log('execute'),返回的是decorator函数,再调用返回的函数,参数是now函数,返回值最终是wrapper函数。

    要使函数new()的名称依然是'new'可以使用Python内置的functools.wraps

    import functools
    def log(t):
        def decorator(func):
            @functools.wraps(func)
            def wrapper(*args,**kw):
                print('%s %s():'%(t,func.__name__))
                return func(*args,**kw)
            return wrapper
        return decorator
    
    @log('T')
    def now(x):
        print(x+1)

  • 相关阅读:
    如何实现基于消息安全验证机制下的username身份验证过程
    Stooge 排序
    严版数据结构题集2.13 & 2.14
    Gnome排序
    严版数据结构题集2.11
    梳排序
    鸡尾酒排序
    C语言如何产生随机数
    Bogo排序
    快排序
  • 原文地址:https://www.cnblogs.com/soberkkk/p/12631801.html
Copyright © 2011-2022 走看看