Python 基础 装饰器

1   装饰器函数的本质:一个闭包函数

2   装饰器的作用:在不修改原函数及其调用方式的情况下对原函数功能进行扩展

3   语法糖 : 格式  :@装饰器名称

4   创建带返回值的装饰器

5   创建传递参数的装饰器

6   装饰器的固定格式

def wrapper(f):
    def inner(*args,**kwargs):
        #被装饰器函数之前执行的代码
        ret = f(*args,**kwargs)
        # 被装饰的函数执行之后的代码
        return ret
    return inner

@wrapper
def fun(*args,**kwargs):
    print('zzz')

7 解决被装饰器函数不能查看信息bug

导入  wraps

from functools import wraps

@wraps(func)

8添加多个装饰器

格式:

@wrapper1

@wrapper2

def f():

执行原理:先执行距离函数近的装饰器@wrapper2

练习1 :创建一个计算函数执行花费时间的闭包函数。

#功能函数
import time
def fun():
    print('感谢cctv,感谢人民感谢党')

#闭包函数
def timer(func):
    def inner():
        start = time.time()
        time.sleep(1)
        func()
        end = time.time()
        print(end - start)

    return inner()

fun = timer(fun)
"""
感谢cctv,感谢人民感谢党
1.0000572204589844
"""

练习2  使用语法糖修改timer()装饰器

import time

def timer(func):
    def inner():
        start = time.time()
        time.sleep(1)
        func()
        end = time.time()
        print(end - start)

    return inner()

#语法糖 : @装饰器名称 等价于fun = timer(fun)
@timer
def fun():
    print('感谢cctv,感谢人民感谢党')

#调用函数
fun()

练习 3  创建一个带返回值的装饰器 (错误版)

 

练习4    创建一个带返回值的装饰器 正确版

import time
def timer(func):
    def inner():
        start = time.time()
        time.sleep(1)
        #接受返回值
        ret = func
        end = time.time()
        print(end - start)
        #返回返回值
        return ret
    return inner()

@timer
def fun():
    print('xxx')
    return 'ok...'

ret = fun
print(ret)

练习5  创建一个带参数的装饰器

import time

def timer(func):
    #1 传递参数
    def inner(s):
        start = time.time()
        time.sleep(1)
        #2 传递参数
        func(s)
        end = time.time()
        print(end - start)

    return inner

@timer
def fun(s):
    print('xxx',s)

fun('ooo')

练习 6  定义一个可以传递任意参数的装饰器

import time


def timer(func):
    def inner(*args, **kwargs):
        start = time.time()
        time.sleep(1)
        func(*args, **kwargs)
        end = time.time()
        print(end - start)

    return inner


@timer
def fun(*args, **kwargs):
    print('传递过来的参数是:', *args, **kwargs)


fun('ooo', 'zs', '张三')

练习 7  使用@wraps(func)解决被装饰函数的信息必能查看问题

import time
from functools import wraps  # 导入warps
def timer(func):
    @wraps(func)
    def inner(*args, **kwargs):
        start = time.time()
        time.sleep(1)
        func(*args, **kwargs)
        end = time.time()
        print(end - start)

    return inner

@timer
def fun(*args,**kwargs):
    """
    :param args:   位置参数
    :param kwargs:  关键词参数
    :return:   无返回值
    """
    print('传递过来的参数:'*args,**kwargs)

fun('aa','bb')
print(fun.__doc__)
print(fun.__name__)

 

猜你喜欢

转载自blog.csdn.net/weixin_44303465/article/details/86556724