zoukankan      html  css  js  c++  java
  • 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即可

    自学课程参照老男孩全栈视频
  • 相关阅读:
    【linux】驱动-13-阻塞与非阻塞
    【linux】驱动-12-并发与竞态
    【linux】驱动-11-gpio子系统
    【linux】驱动-10-pinctrl子系统
    【linux】驱动-9-设备树插件
    手写Java分页模块
    JDBC连接与自定义线程池
    类加载器
    网络编程之TCP
    网络编程之UDP
  • 原文地址:https://www.cnblogs.com/chenrongjin/p/10017040.html
Copyright © 2011-2022 走看看