装饰器

装饰器

什么是装饰器

装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。

装饰器的应用场景:比如插入日志,性能测试,事务处理,缓存等等场景。

装饰器的形成过程

import time 
def func1():
    print("in func1")
​
def timer(func):
    def inner():
        start = time.time()
        func()
        print(time.time() - start)
    return inner
​
func1 = timer(func1)
func1()

 

每次执行func1 = timer(func1)会很麻烦,python提供了一个简单的方法:语法糖。

import time 
​
def timer(func):
    def inner():
        start = time.time()
        func()
        print(time.time() - start)
    return inner
​
@timer  # --> func1 = timer(func1)
def func1():
    print("in func1")
​
func1()

 

带参数的装饰器

import time
​
def timer(func):
    def inner(a):
        start = time.time()
        func(a)
        print(time.time() - start)
    return inner
​
@timer
def func1(a):
    print(a)
​
func1()
import time
def timer(func):
    def inner(*args, **kwargs):
        start = time.time()
        re = func(*args, **kwargs)
        print(time.time() - start)
        return re
    return inner
​
@timer
def func1(a, b):
    print("in func1")
​
@timer
def func2(a):
    print("in func2 and get a:%s" % a)
    return "func2 over"
​
func1("aaaaaa", "bbbbbb")
print(func2("aaaaaa"))

 

查看函数信息的方法:

from functools import wraps
​
def deco(func):
    @wraps(func)  # 加在最内层函数正上方
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
    return wrapper
​
@deco
def index():
    """哈哈哈哈"""
    print("from index")
    
print(index.__doc__)
print(index.__name__)

 

开放封闭原则

1.对扩展是开放的

2.对修改时封闭的

装饰器的主要功能和固定结构

def timer(func):
    def inner(*args, **kwargs):
        """执行函数之前要做的"""
        re = func(*args, **kwargs)
        """执行函数之后要做的"""
        return re
    return inner
from functools import wraps
​
def deco(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
    return wrapper

 

如何去掉装饰器

def outer(flag):
    def timer(func):
        def inner(*args, **kwargs):
            """执行函数之前要做的"""
            re = func(*args, **kwargs)
            """执行函数之后要做的"""
            return re
        return inner
    return timer
​
@outer(False)
def func():
    print(111)
func()

 

多个装饰器装饰一个函数

def wrapper1(func):
    def inner():
        print("wrapper1, before func")
        func()
        print("wrapper1, after func")
    return inner
​
def wrapper2(func):
    def inner():
        print("wrapper2, before func")
        func()
        print("wrapper2, after func")
    return inner
​
@wrapper2
@wrapper1
def f():
    print("in f")
f()

 

 

上一篇:模块与包


下一篇:函数进阶3