zoukankan      html  css  js  c++  java
  • python之路day11装饰器形成的过程、作用、装饰器的固定模式

    装饰器形成的过程
    # 装饰器的作用
    # 原则:开放封闭原则
    #装饰器的固定模式

    import time
    # print(time.time()) #1551251400.416998 当前时间()
     #让程序停5s
    #语法糖:
    
    # 1)简单的装饰器
    def timmer(f):  #func     #timmer就是一个装饰器函数
        def inner():
            start = time.time()
            f() #用外部函数的变量f 是一个闭包  f()就是被装饰的函数
            end = time.time()
            print(end-start)
        return inner #返回内部函数的名字(注意)
    
    
    @timmer   #语法糖 @装饰器函数名,下面必须是被装饰的函数
    def func(): #被装饰的函数
        time.sleep(0.01)
        print('大魔王法克儿')
        return '新年好'
    # func=timmer(func) #有了语法糖这一句就不用写了
    func()  #相当于是inner()
    # 2) 带返回值的
    def timmer(f):  #func     #timmer就是一个装饰器函数
        def inner():
            start = time.time()
            ret =f() #用外部函数的变量f 是一个闭包  f()就是被装饰的函数
            end = time.time()
            print(end-start)
            return ret #加了一个返回值
        return inner #返回内部函数的名字(注意)
    
    
    @timmer   #语法糖 @装饰器函数名,下面必须是被装饰的函数
    def func(): #被装饰的函数
        time.sleep(0.01)
        print('大魔王法克儿')
        return '新年好'
    # func=timmer(func) #有了语法糖这一句就不用写了
    ret=func()  #相当于是inner()
    print(ret)
    # # 3) 加参数
    def timmer(f):  #func     #timmer就是一个装饰器函数
        def inner(a):
            start = time.time()
            ret =f(a) #用外部函数的变量f 是一个闭包  f()就是被装饰的函数
            end = time.time()
            print(end-start)
            return ret #加了一个返回值
        return inner #返回内部函数的名字(注意)
    
    
    @timmer   #语法糖 @装饰器函数名,下面必须是被装饰的函数
    def func(a): #被装饰的函数
        time.sleep(0.01)
        print('大魔王法克儿')
        return '新年好'
    # func=timmer(func) #有了语法糖这一句就不用写了
    ret=func(1)  #相当于是inner()
    print(ret)

    # 4) 加一堆参数 *args,**kwargs接受
    def timmer(f):  #func     #timmer就是一个装饰器函数
        def inner(*args,**kwargs):
            start = time.time()
            ret =f(*args,**kwargs) #f(1,2)
            end = time.time()
            print(end-start)
            return ret #加了一个返回值
        return inner #返回内部函数的名字(注意)
    
    
    @timmer   #语法糖 @装饰器函数名,下面必须是被装饰的函数
    def func(a,b): #被装饰的函数
        time.sleep(0.01)
        print('大魔王法克儿')
        return '新年好'
    
    @timmer   #语法糖 @装饰器函数名,下面必须是被装饰的函数
    def func(a): #被装饰的函数
        time.sleep(0.01)
        print('大魔王法克儿')
        return '新年好'
    
    ret=func(1,2)  #相当于是inner()
    ret=func(1,b=2)
    print(ret)

    装饰器的作用

    #在不想修改函数的调用方式 但是还想再原来的函数前后添加功能
    # timmer就是一个装饰器函数,只是对一个函数,有一些装饰作用

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

    装饰器的固定模式

    def wrapper(f): #装饰器函数,f是被装饰的函数
        def inner(*args,**kwargs):
            '''在被装饰函数之前要做的事情'''
            ret = f(*args,**kwargs) #被装饰的函数
            '''在被装饰函数之后要做的事情'''
            return ret
        return inner
    
    @wrapper  #语法糖  @+装饰器函数名
    def func(a,b): #被装饰的函数
        print('大魔王法克儿')
        return '新年好'

    执行顺序  

    装饰器想当与一个中介,

  • 相关阅读:
    python学习笔记之九:模块和包
    python学习笔记之八:迭代器和生成器
    python学习笔记之七:魔法方法,属性
    python学习笔记之六:更加抽象
    python学习笔记之五:抽象
    python学习笔记之四:条件,循环和其他语句
    python学习笔记之三:字典,当索引不好用时
    python学习笔记之二:使用字符串
    yolo自己的数据集中LabelImg的安装出现No module named 'libs.resources'错误
    django2 rest_framework + vue.js + mysql5.6 实现增删改查
  • 原文地址:https://www.cnblogs.com/hanfe1/p/10445589.html
Copyright © 2011-2022 走看看