python学习笔记(1)_装饰器

之前草草看了一遍,感觉很容易忘,果然还是要记点笔记。

这次目标是:python+web编程 

 

 

函数也是一个对象,可以赋值给变量:

def now():
    print('hello')

f=now()
f() #调用now()
print(f.__name__) #获得now()中__name__

现在要增强now()功能,但又不改原来now()代码,这种在代码运行期间动态增加功能的方式,称作装饰器(decorator). 

本质上,装饰器是一个返回函数的函数,返回的的函数中封装了新功能与原有函数:

#给now添加功能:调用前打印__name__
def log(func):
    def wrapper(*args, **kw):
        print('%s' %func.__name__)
        return func(*args, **kw)
    return wrapper

@log  #装饰器语法
def now():
    print('hello')

使用@log就能把log装饰器功能增加到now上面,这时调用now(),会在之前打印__name__

相当于执行了  now=log(now) 

如果增加的功能中需要传入参数,要返回decorator的高阶函数:

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

@log('someText')
def now():
    print('hello')

相当于执行了now=log('someText')(now)

现在还有一个问题,now是增加了功能,但因为返回的是wrapper函数,此时now.__name__是wrapper,要解决这个问题,需要用functools.wraps:

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

#或者带参数的
def log(text):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            print('%s : %s:' % (text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator

 

以上内容摘自:http://www.liaoxuefeng.com/ 

其实就是大概敲了一遍... 不过起码仔细了一些... 

 

你可能感兴趣的:(python学习笔记(1)_装饰器)