day11:初步了解装饰器

开始接触装饰器:

import time             #导入时间模块


def func():             #被装饰的函数
    time.sleep(0.01)    #让程序执行到这里时暂停0.01秒
    print("测试一下")


def time_counter(f):    #装饰器函数    如果想不到定义名字,一般用wrapper,意思就是装饰器
    def inner():
        start = time.time()
        f()             #被装饰的函数 --> 执行def func()函数
        end = time.time()
        print(end - start)
    return inner        #返回inner的内存地址


func = time_counter(func)    #inner的内存地址赋给 func
func()                       #实际调用 inner() 函数,告诉 def inner() 函数开始执行

 装饰器的作用:在不修改函数调用方式的情况下,还想在原来的函数前后添加功能

开放封闭原则
开放:对扩展是开放的
封闭:对修改是封闭的

进一步了解装饰器:引入"语法糖"概念,表示形式为  @装饰器函数名
                                @装饰器函数名,要紧紧贴在被装饰函数的上面,用来修饰被装饰函数

import time


def time_counter(f):
    def inner():
        start = time.time()
        ret = f()    #接收被装饰函数的返回值
        end = time.time()
        print(end - start)
        return ret   #返回被装饰函数的返回值
    return inner


@time_counter         #相当于执行func = time_counter(func)
def func():
    time.sleep(0.01)
    print("测试一下")
    return "两只老虎"  #返回值,通过inner()函数返回自己的返回值


ret = func()          #func为inner的内存地址
print(ret)

装饰"带参数函数"的装饰器(最终版):

import time


def time_counter(f):
    def inner(*args, **kwargs):
        start = time.time()
        ret = f(*args, **kwargs)    
        end = time.time()
        print(end - start)
        return ret    
    return inner


@time_counter    
def func():
    time.sleep(0.01)
    print("once test")
    return "second test"    


ret = func()  
print(ret)

装饰器的固定模式:

def wrapper(f):    #装饰器函数,f是被装饰的函数
    def inner(*args, **kwargs):
        """在被装饰函数之前要做的事"""
        ret = f(*args, **kwargs)    #被装饰的函数,及其返回值赋给ret
        """在被装饰函数之后要做的事"""
        return ret
    return inner

猜你喜欢

转载自www.cnblogs.com/believepd/p/9567096.html
今日推荐