• 开放封闭原则 装饰器


    day14

    一丶开放封闭原则

    开放原则:

    增加一些额外的新功能

    封闭原则:

    不改变源码.以及调用方式

    二丶初识装饰器

    装饰器:

    也可以称为装饰器函数,诠释开放封闭原则,装饰器的本质是闭包

    ###普通版装饰器
    import time
    def timmer(x): # x 接收的原函数的内存地址
       def inner():
           start_time=time.time()
           x() # 执行 原函数
           print(f'执行效率{time.time()-start_time}')
       return inner

    def index():                
       time.sleep(2)
       print(f'欢迎访问本站博客园')

       
    index=timmer(index)         #将timmer函数执行的结果返回,付给index变量      
    index()   #这里执行的inner函数



    ###标准版 @timmer是语法糖(黏贴在被装饰函数,先于执行被装饰函数),装饰器函数必写在被装饰函数之上.
    import time
    def timmer(func): # 此时 func 就是一个自由变量
       def inner():
           start_time = time.time()
           func() # func 是timmer函数传递过来的index原函数的内存地址
           print(f'执行效率 {time.time() - start_time}')
       return inner

    @timmer       # 等同于 index=timmer(index) 往下读一行
    def  index():
       time.sleep(2)
       print('登录成功')

    index()   #这里执行的inner函数

     

    三丶被装饰器数带返回值

    ###需求被装饰函数有返回值

    import time
    def timmer(func):  # 这里argv 接收的真正要执行的原函数.
       def inner():      
           start_time=time.time()
           var=func()
           print(f'{time.time()-start_time},{args[0]},{args[1]}')

           return var #原函数有返回值, 这里是执行完 inner函数 中真正要返回的原函数执行的结果
       return  inner

    @timmer
    def index(*args,**kwargs):
       time.sleep(2)
       print('进入到网页index页面')
       return True # 原函数 最重返回的结果是 True


    print(index(1,2))   # 这里是执行 inner方法

     

    四丶被装饰函数带参数

    ###需求 被装饰函数有参数
    import  time
    def timmer(func):

       def inner(*args,**kwargs):  # inner方法执行,接收的参数, 将形参参数聚合 args=(1,2)
           # 函数定义时 , * ,** 代表聚合
           
           start_time=time.time()
           
           res=func(*args,**kwargs) # 执行真正的原函数, 将参数打散 func(1,2)
           # 函数执行时 ,* ,** 代表打散
           
           print(f'{time.time()-start_time} 这是{args[0]}')
           
           return res

       return inner

    @timmer
    def index(args):
       time.sleep(2)
       print(f'welcome {args}')
    return True

    index('都来看')

     

    五丶标准终终结版装饰器

    ######  装饰器原版   ####
    def warpper(func):
       def inner(*args,**kwargs):
           '''被装饰器之前的操作'''
           ret=func(*args,**kwargs)
           '''被装饰函数之后的操作'''
           return ret
       return inner




    ####拓展版   计算index函数执行的效率

    import  time
    def timmer(func):
       
       def inner(*args,**kwargs):  # inner方法执行,接收的参数, 将形参参数聚合 args=(1,2)
           # 函数定义时 , * ,** 代表聚合
           
           start_time=time.time()
           
           res=func(*args,**kwargs) # 执行真正的原函数, 将参数打散 func(1,2)
           # 函数执行时 ,* ,** 代表打散
           
           print(f'{time.time()-start_time} 这是{args[0]}')
       
      return res #原函数有返回值, 这里是执行完 inner函数 中真正要返回的原函数执行的结果
       
       return inner #返回inner函数, 给index重新赋值.

    @timmer #语法糖,等同于 index=timmer(index) , 把index原函数作为形参传递给timmer函数func
    def index(args): # 原函数具有传参的功能
       time.sleep(2)
       print(f'welcome {args}')
    return True # 原函数具有返回值的功能

    index('都来看')     # 执行的是inner函数,把参数传递给inner函数,






    ####装饰器:
    #1.必须存在嵌套函数中
       #2.必须存在内存函数对外层函数(非全局变量)的引用
       #3.必须具有return 返回嵌套函数的内存地址(嵌套函数名字)
    #4.内层函数必须能够接收原函数传递的参数
       #5.内存函数执行完必须返回原函数要返回的结果
       
    ####装饰器约束:
    #1.不得更改源码,
       #2.不能更改调用方式
       
    ####应用场景:
    #用户登录验证
        #打印日志

     

  • 相关阅读:
    print输出带颜色特效的方法
    为什么pymysql执行SQL语句后提示成功,但没有实际操作数据库?
    Mysql支持的数据类型
    基本的SQL语句
    初次运行Git前的配置
    git安装
    Hadoop HA 搭建
    Ubuntu下编译 Hadoop2.9
    Mac 下编译 Hadoop
    Windows下编译 Hadoop
  • 原文地址:https://www.cnblogs.com/xiangwang1/p/12180016.html
Copyright © 2020-2023  润新知