• 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即可

    自学课程参照老男孩全栈视频
  • 相关阅读:
    java--保留重复排序
    java--TreeSet比较器排序
    java--去重练习
    java--HashSet
    java--集合可变参数
    spring MVC入门
    java IO详解
    spring入门
    redis详解
    maven教程
  • 原文地址:https://www.cnblogs.com/chenrongjin/p/10017040.html
Copyright © 2020-2023  润新知