python笔记(装饰器)

#装饰器形成的过程(执行原来的函数但不改变原来的函数内容,又能添加新的功能)
#timer就是一个装饰器函数,只是对一个函数有一些装饰作用

import time

def timer(f):#1                装饰器函数
    def inner():#4
        start = time.time()#7
        f()#8                  被装饰的函数
        end = time.time()#11
        print(end - start)#12
    return inner#5

def func():#2
    time.sleep(0.01)#9
    print('大家好!')#10

func = timer(func)#3
func()#6

1.装饰器的作用:不想修改函数的调用方式,但是还想在原来的函数前后添加功能)
在这里插入图片描述
在这里插入图片描述

2.@装饰器名字用法(实现与上一样的功能)

import time
def timer(f):#1                装饰器函数
    def inner():#4
        start = time.time()#7
        f()#8                  被装饰的函数
        end = time.time()#11
        print(end - start)#12
    return inner#5
@timer                   #语法糖(@timer == func = timer(func)#3)    @装饰器函数
def func():#2
    time.sleep(0.01)#9
    print('大家好!')#10

 #func = timer(func)#3
func()#6

3.被修饰函数有返回值

import time
def timer(f):#1                装饰器函数
    def inner():#4
        start = time.time()#7
        ret = f()#8                  被装饰的函数
        end = time.time()#11
        print(end - start)#12
        return ret
    return inner#5
@timer                   #语法糖(@timer == func = timer(func)#3)    @装饰器函数
def func():#2
    time.sleep(0.01)#9
    print('大家好!')#10
    return '新年好'
# func = timer(func)#3
retu = func()#6
print(retu)

4.被修饰函数带参数

import time

def timer(f):#1                装饰器函数
    def inner(a):#4
        start = time.time()#7
        ret = f(a)#8                  被装饰的函数
        end = time.time()#11
        print(end - start)#12
        return ret
    return inner#5
@timer                   #语法糖(@timer == func = timer(func)#3)    @装饰器函数
def func(a):#2
    time.sleep(0.01)#9
    print('大家好!'+ a)#10
    return '新年好'
# func = timer(func)#3
retu = func('同事好')#6
print(retu)

5.两种不同的传参方式

import time
 
def timer(f):#1                装饰器函数
    def inner(*args,**kwargs):#4
        start = time.time()#7
        ret = f(*args,**kwargs)#8                  被装饰的函数
        end = time.time()#11
        print(end - start)#12
        return ret
    return inner#5
@timer                   #语法糖(@timer == func = timer(func)#3)    @装饰器函数
def func(a,b):#2
    time.sleep(0.01)#9
    print('大家好!',a,b)#10
    return '新年好'
@timer
def func1(a):#2
    time.sleep(0.01)#9
    print('大家好!'+ a)#10
    return '新年好'
retu = func(1,2)#6
print(retu)
retu1 = func(1,b = 2)
print(retu1)

6.原则:开放封闭原则
(1) 开放:对扩展是开放的
(2) 封闭: 对修改是封闭的

7.装饰器(wrapper)的固定模式

import time
def timer(f):#1                装饰器函数
    def inner(*args,**kwargs):#4
        '''在被装饰函数之前要做的事'''
        ret = f(*args,**kwargs)#8                  被装饰的函数
        '''在被装饰函数之后要做的事'''
        return ret
    return inner#5
@timer                   #语法糖(@timer == func = timer(func)#3)    @装饰器函数
def func(a,b):#2
    time.sleep(0.01)#9
    print('大家好!',a,b)#10
    return '新年好'

猜你喜欢

转载自blog.csdn.net/qq_41433183/article/details/83410529