zoukankan      html  css  js  c++  java
  • day17

    装饰器:1.what
    器:指的就是一种工具,可以定义成函数
    装饰:指的就是为其他事物添加额外的点缀
    合在一起:指的就是定义一个函数用来装饰其他函数也就是为其他函数添加额外功能的
    2.why
    开放封闭原则:
    开放:是对拓展功能来说是开放的
    封闭:是对源代码的修改是封闭的
    装饰器就是在不修改源码的情况下为装饰对象添加额外的功能,源码包括函数的定义和调用两个过程
    3.how
    # 需求:在不修改index函数的源代码以及调用方式的前提下为其添加统计运行时间的功能
    import time
    time.time()获取当前时间
    def index(x,y):
    time.sleep(3)
    print('index %s %s' %(x,y))

    index(111,222)
    index(y=111,x=222)
    index(111,y=222)

    解决方案一:失败
    # 问题:没有修改被装饰对象的调用方式,但是修改了其源代码
    # def index(x,y):
    # start=time.time()
    # time.sleep(3)
    # print('index %s %s' %(x,y))
    # stop = time.time()
    # print(stop - start)
    #
    # index(111,222)

    # 解决方案二:
    # 问题:没有修改被装饰对象的调用方式,也没有修改了其源代码,并且加上了新功能
    # 但是代码冗余
    # import time
    #
    # def index(x,y):
    # time.sleep(3)
    # print('index %s %s' %(x,y))
    #
    # start=time.time()
    # index(111,222)
    # stop=time.time()
    # print(stop - start)

    # 解决方案三:
    # 问题:解决了方案二代码冗余问题,但带来一个新问题即函数的调用方式改变了
    import time

    def index(x,y):
    time.sleep(3)
    print('index %s %s' %(x,y))

    def wrapper():
    start=time.time()
    index(111,222)
    stop=time.time()
    print(stop - start)

    wrapper()

    def index(x,y,z):
    time.sleep(3)
    print('index %s %s %s' %(x,y,z))

    print(index)

    def outter(func):
    # func = index的内存地址
    def wrapper(*args,**kwargs):
    start=time.time()
    func(*args,**kwargs) # index的内存地址()
    stop=time.time()
    print(stop - start)
    return wrapper

    index=outter(index) # f=outer(index的内存地址)
    # f=当初那个wrapper函数的内存地址
    print(index)

    # index(x=1,y=2,z=3)
    # index(1,2,3)
    index(1,z=3,y=2)
    语法糖:在被装饰函数的上方,放一个@装饰器名代替了index=outter(index) # f=outer(index的内存地址)的工作

  • 相关阅读:
    AGC015E Mr.Aoki Incubator
    luogu P3520 [POI2011]SMI-Garbage
    442.Find All Duplicates in an Array
    SICP_2.61-2.62
    sicp_2.59-2.60
    SICP_2.58
    SICP_2.56-2.57
    SICP_2.53-2.55
    SICP_2.52-2.53
    SICP_2.50-2.51
  • 原文地址:https://www.cnblogs.com/Jicc-J/p/12555613.html
Copyright © 2011-2022 走看看