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)

  • 相关阅读:
    使用express框架创建服务器
    搭建第一个node服务器
    Node 与JS的区别
    node学习之路
    【每天一个linux命令】read
    【每天一个linux命令】awk
    【每天一个linux命令】wc
    【每天一个linux命令】sed
    【每天一个linux命令】tee
    【每天一个linux命令】find
  • 原文地址:https://www.cnblogs.com/soberkkk/p/12631801.html
Copyright © 2011-2022 走看看