zoukankan      html  css  js  c++  java
  • Python自学笔记(15day)

    装饰器

    (1)装饰器的原则:开放封闭原则

       开放:对扩展是开放的

      封闭:对修改是封闭的

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

    装饰器的分类

    (1)不含有返回值return的装饰器

    import time 
    def func():
        time.sleep(0.01)
        print("帅哥")
    
    def timmer(f):               #装饰器函数,timmer装饰器函数函数名字
        def inner():             #定义一个闭包函数inner()
            start=timer.timer()
            f()
            end=time.time()
            print(end-start)
        return inner
    
    func=timmer(func)      #返回的是闭包函数的函数名字
    func()

    (2)含有返回值return的装饰器

    import time
    def func():
        time.sleep(0.01)
        print("帅哥")
        return "王然"
    
    def timmer(f):               #装饰器函数,timmer装饰器函数函数名字
        def inner():             #定义一个闭包函数inner()
            start=timer.timer()
            ret=f()             #调用f()拿到返回值赋值给ret
            end=time.time()
            print(end-start)
            return ret          #将ret返回给闭包函数
        return inner
    
    func=timmer(func)      #返回的是闭包函数的函数名字
    print(func())           #func()拿到返回值"王然"
    
    #被装饰的函数有返回值return时,这时候在调用fun(),执行闭包函数打印出来,闭包函数本身没
    #有返回值,打印就会出错,所以加一个返回值,返回的是被装饰函数的返回值,用变量ret代替,
    #再闭包函数中,func()赋值给ret

    (3)带有一个参数的装饰器

    import time
    def func(a):
        time.sleep(0.01)
        print("帅哥",a)
        return "王然"
    
    def timmer(f):               #装饰器函数,timmer装饰器函数函数名字
        def inner(a):             #定义一个闭包函数inner()
            start=timer.timer()
            ret=f(a)             #调用f()拿到返回值赋值给ret
            end=time.time()
            print(end-start)
            return ret          #将ret返回给闭包函数
        return inner
    
    func=timmer(func)      #返回的是闭包函数的函数名字
    print(func(a))           #func()拿到返回值"王然"
    
    #当被装饰函数有参数时,调用func(),也必须加一个参数,但是实际上func()是执行闭包函数,
    #所以inner(a)也要加上参数,里面的f(a)也要加上参数

    (4)带有多参数与混合参数的装饰器

    import time
    def func(*args,**kwargs):
        time.sleep(0.01)
        print("帅哥",a)
        return "王然"
    
    def timmer(f):               #装饰器函数,timmer装饰器函数函数名字
        def inner(*args,**kwargs):             #定义一个闭包函数inner()
            start=timer.timer()
            ret=f(*args,**kwargs)             #调用f()拿到返回值赋值给ret
            end=time.time()
            print(end-start)
            return ret          #将ret返回给闭包函数
        return inner
    
    func=timmer(func)      #返回的是闭包函数的函数名字
    print(func(1,a=2))           #func()拿到返回值"王然"

    总结:装饰器固定格式

    def wrapper(f):            #定义一个装饰器函数,wrapper装饰器函数名,f被装饰函数名
        def inner(*args,**kwargs):              #定义闭包函数,出传入参数
            """在被装饰函数之前要做的事情"""
            ret=f(*args,**kwargs)            #被装饰函数赋值
            """在被装饰之后做的事情"""
            return ret
        return inner                     #返回闭包函数函数名给装饰器函数
    
    @wrapper               #等价于列子中的 func=wrapper(f):得到闭包函数函数名字
    def func(*args,**kwargs):   #被装饰的函数
        pass
    func(*args,**kwargs) #调用被装饰函数,其实相当于执行@wrapper():执行闭包函数
  • 相关阅读:
    Java关键字new和newInstance的区别
    关于能提高Java代码可重用性的三个措施
    Java编程技巧—— JDBC编程总结
    Java高质量代码之数组与集合
    ab的压力测试(转)
    利用DOCKER实现云桌面的开发环境初步设想
    时间和日期
    内存流-操作文件的方式操作内存
    获取文件描述符
    流定位
  • 原文地址:https://www.cnblogs.com/baobaoran/p/9691496.html
Copyright © 2011-2022 走看看