07-Python基础之装饰器

pyhon基础之装饰器

装饰器的作用

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

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

装饰器的本质:闭包函数

#通用装饰器格式
def wrapper(func): #装饰器函数,func是被装饰的函数
    def inner(*args,**kwargs):
        print('在被装饰的函数执行之前做的事')
        ret = func(*args,**kwargs)#被装饰的函数
        print('在被装饰的函数执行之后做的事')
        return ret
    return inner

@wrapper   #holiday = wrapper(holiday) #语法糖 @装饰器函数名
def holiday(day): #被装饰的函数
    print('全体放假%s天'%day)
    return '好开心'
ret = holiday(3)
print(ret)

'''
打印:
在被装饰的函数执行之前做的事
全体放假3天
在被装饰的函数执行之后做的事
好开心
'''

装饰器进阶:

带参数的装饰器:

即多一个变量存储标识位,来决定被装饰函数是否需要装饰。

#带参数的作用,即是定义一个标识位决定是否需要函数是否需要装饰
import time
FLAGE = False
def timmer_out(flag):
    def timmer(func):
        def inner(*args,**kwargs):
            if flag:
                start = time.time()
                ret = func(*args,**kwargs)
                end = time.time()
                print(end-start)
                return ret
            else:
                ret = func(*args, **kwargs)
                return ret
        return inner
    return timmer
# timmer = timmer_out(FLAGE)
@timmer_out(FLAGE)    #wahaha = timmer(wahaha)
def wahaha():
    time.sleep(0.1)
    print('wahahahahahaha')

@timmer_out(FLAGE)
def erguotou():
    time.sleep(0.1)
    print('erguotoutoutou')

wahaha()
erguotou()
View Code

flag = Ture执行装饰的器,False不执行装饰器

多个装饰器装饰一个函数

def wrapper1(func):
    def inner1():
        print('wrapper1 ,before func')
        ret = func()
        print('wrapper1 ,after func')
        return ret
    return inner1

def wrapper2(func):
    def inner2():
        print('wrapper2 ,before func')
        ret = func()
        print('wrapper2 ,after func')
        return ret
    return inner2

@wrapper2
@wrapper1
def f():
    print('in f')
    return '哈哈哈'
f()
View Code

执行过程如下图:

多个装饰器装饰一个函数的执行过程?

from functools import wraps的作用,将,holiday.__name__,holiday.__doc__指向holiday,

即将本地的__name__,__doc__指向被装饰函数,而不再指向inner函数,只需要在内部函数前加@ wraps即可

自学课程参照老男孩全栈视频
原文地址:https://www.cnblogs.com/chenrongjin/p/10017040.html