装饰器的初识(代码片段)

wyh0717 wyh0717     2022-12-13     192

关键词:

装饰器的初识

    • 版本一: 大壮 写一些代码测试一下index函数的执行效率。
    import time
    # def index():
    #     ‘‘‘有很多代码.....‘‘‘
    #     time.sleep(2) # 模拟的网络延迟或者代码效率
    #     print(‘欢迎登录博客园首页‘)
    #
    # def dariy():
    #     ‘‘‘有很多代码.....‘‘‘
    #     time.sleep(3) # 模拟的网络延迟或者代码效率
    #     print(‘欢迎登录日记页面‘)
    
    # 版本一有问题: 如果测试别人的代码,必须重新赋值粘贴。
    # start_time = time.time()
    # index()
    # end_time = time.time()
    # print(end_time-start_time)
    #
    # start_time = time.time()
    # dariy()
    # end_time = time.time()
    # print(end_time-start_time)
    
    
    
    • 版本二:利用函数,解决代码重复使用的问题

      import time
      def index():
          ‘‘‘有很多代码.....‘‘‘
          time.sleep(2) # 模拟的网络延迟或者代码效率
          print(‘欢迎登录博客园首页‘)
      # index()
      def dariy():
          ‘‘‘有很多代码.....‘‘‘
          time.sleep(3) # 模拟的网络延迟或者代码效率
          print(‘欢迎登录日记页面‘)
      
      def timmer(f):  # f= index
          start_time = time.time()
          f()  # index()
          end_time = time.time()
          print(f‘测试本函数的执行效率end_time-start_time‘)
      timmer(index)
      
      版本二还是有问题: 原来index函数源码没有变化,给原函数添加了一个新的功能测试原函数的执行效率的功能。
      满足开放封闭原则么?原函数的调用方式改变了。
      
      
      
    • 版本三:不能改变原函数的调用方式。

      # import time
      # def index():
      #     ‘‘‘有很多代码.....‘‘‘
      #     time.sleep(2) # 模拟的网络延迟或者代码效率
      #     print(‘欢迎登录博客园首页‘)
      #
      # def timmer(f):  # f = index  (funciton index123)
      #     def inner():  # inner :(funciton inner123)
      #         start_time = time.time()
      #         f()  # index() (funciton index123)
      #         end_time = time.time()
      #         print(f‘测试本函数的执行效率end_time-start_time‘)
      #     return inner  # (funciton inner123)
      # timmer(index)  # index()
      # ret = timmer(index)  # inner
      # ret()  # inner()
      
      # index = timmer(index)  # inner (funciton inner123)
      # index()  # inner()
      
      
      
    • 版本四:具体研究

      import time
      def index():
          ‘‘‘有很多代码.....‘‘‘
          time.sleep(2) # 模拟的网络延迟或者代码效率
          print(‘欢迎登录博客园首页‘)
      
      def timmer(f):
          f = index
          # f = <function index at 0x0000023BA3E8A268>
          def inner():
              start_time = time.time()
              f()
              end_time = time.time()
              print(f‘测试本函数的执行效率end_time-start_time‘)
          return inner
      
      index = timmer(index)
      index()
      
    • 版本五:python做了一个优化;提出了一个语法糖的概念。 标准版的装饰器

      import time
      # timmer装饰器
      def timmer(f):
          def inner():
              start_time = time.time()
              f()
              end_time = time.time()
              print(f‘测试本函数的执行效率end_time-start_time‘)
          return inner
      
      # @timmer # index = timmer(index)
      def index():
          ‘‘‘有很多代码.....‘‘‘
          time.sleep(0.6) # 模拟的网络延迟或者代码效率
          print(‘欢迎登录博客园首页‘)
          return 666
      ret = index()
      print(ret)
      
      def dariy():
          ‘‘‘有很多代码.....‘‘‘
          time.sleep(3) # 模拟的网络延迟或者代码效率
          print(‘欢迎登录日记页面‘)
      dariy()
      # index = timmer(index)
      # index()
      # dariy = timmer(dariy)  @timmer
      dariy()
      
      
      
    • 版本六:被装饰函数带返回值

      import time
      # timmer装饰器
      def timmer(f):
          # f = index
          def inner():
              start_time = time.time()
              # print(f‘这是个f():f()!!!‘) # index()
              r = f()
              end_time = time.time()
              print(f‘测试本函数的执行效率end_time-start_time‘)
              return r
          return inner
      
      @timmer # index = timmer(index)
      def index():
          ‘‘‘有很多代码.....‘‘‘
          time.sleep(0.6) # 模拟的网络延迟或者代码效率
          print(‘欢迎登录博客园首页‘)
          return 666
      # 加上装饰器不应该改变原函数的返回值,所以666 应该返回给我下面的ret,
      # 但是下面的这个ret实际接收的是inner函数的返回值,而666返回给的是装饰器里面的
      # f() 也就是 r,我们现在要解决的问题就是将r给inner的返回值。
      ret = index()  # inner()
      print(ret)
      
      
    • 版本七:被装饰函数带参数

      import time
      # timmer装饰器
      def timmer(f):
          # f = index
          def inner(*args,**kwargs):
              #  函数的定义:* 聚合  args = (‘李舒淇‘,18)
              start_time = time.time()
              # print(f‘这是个f():f()!!!‘) # index()
              r = f(*args,**kwargs)
              # 函数的执行:* 打散:f(*args) --> f(*(‘舒淇‘,18))  --> f(‘舒淇‘,18)
              end_time = time.time()
              print(f‘测试本函数的执行效率end_time-start_time‘)
              return r
          return inner
      
      @timmer # index = timmer(index)
      def index(name):
          ‘‘‘有很多代码.....‘‘‘
          time.sleep(0.6) # 模拟的网络延迟或者代码效率
          print(f‘欢迎name登录博客园首页‘)
          return 666
      index(‘纳钦‘)  # inner(‘纳钦‘)
      
      @timmer
      def dariy(name,age):
          ‘‘‘有很多代码.....‘‘‘
          time.sleep(0.5) # 模拟的网络延迟或者代码效率
          print(f‘欢迎age岁name登录日记页面‘)
      dariy(‘舒淇‘,18)  # inner(‘舒淇‘,18)
      
      

      标准版的装饰器

      标准版的装饰器;
      
      def wrapper(f):
          def inner(*args,**kwargs):
              ‘‘‘添加额外的功能:执行被装饰函数之前的操作‘‘‘
              ret = f(*args,**kwargs)
              ‘‘‘‘添加额外的功能:执行被装饰函数之后的操作‘‘‘
              return ret
          return inner
      
      

python进阶装饰器(decorator)(代码片段)

装饰器(Decorator)装饰器1.装饰器的定义2.装饰器的示例代码3.装饰器的语法糖写法4.小结装饰器的使用1.装饰器的使用场景2.装饰器实现已有函数执行时间的统计2.小结通用装饰器的使用1.装饰带有参数的函数2.装饰带有返... 查看详情

装饰器初识

*******装饰器的形成过程********1)装饰器简单版本importtimedeffunc1():print(‘infunc1‘)deftimer(func):definner():start=time.time()func()print(time.time()-start)returninnerfunc1=timer(func1)func1()2)装饰器----语法糖importtime 查看详情

textpython包装装饰器的作用(代码片段)

查看详情

python装饰器的另类用法(代码片段)

之前有比较系统介绍过Python的装饰器,本文算是一个补充。今天我们一起探讨一下装饰器的另类用法。语法回顾开始之前我们再将Python装饰器的语法回顾一下。@decoratedeff(...):pass等同于:deff(...):passf=decorate(f)@语法的好处在于:相... 查看详情

装饰器的一般用法(代码片段)

基本写法:deflog(func):defwrapper(*args,**kw):print(‘call%s():‘%func.__name__)returnfunc(*args,**kw)returnwrapper 查看详情

关于装饰器的两个小练习(代码片段)

关于装饰器的小练习python装饰器练习题第一题第二题第一题最近刚学了装饰器,最近有个小练习,自己实现了下,具体需求如下:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后... 查看详情

typescript装饰器的执行原理(代码片段)

装饰器本质上提供了对被装饰对象Property?Descriptor的操作,在运行时被调用。因为对于同一对象来说,可同时运用多个装饰器,然后装饰器中又可对被装饰对象进行任意的修改甚至是替换掉实现,直观感觉会有一些主观认知上的... 查看详情

装饰器修正以及装饰器的语法糖@(代码片段)

1.importtimedefindex():print(‘welcome‘)time.sleep()return123defoutter(func):#func=最原始的那个index的内存地址defwrapper():start=time.time()res=func()#最原始那个index的内存地址()stop=time.time()print(‘timeis%s‘%(stop-start 查看详情

markdown【蟒蛇】装饰器的基础使用说明(代码片段)

查看详情

pythonstudy——装饰器的简单实现(代码片段)

...写!!func=outer(func)=innerdeffunc():    print("原有功能")#装饰器:满足开放封闭原则的一个闭包应用#@outer语法来调用outer,规定传入被装饰的函数对 查看详情

两个装饰器的执行顺序(代码片段)

两个装饰器的执行顺序如下,两个装饰器time_func和auth_func分别实现了测试程序耗时和认证功能importtimeuser_name="zb"user_pwd="123"deftime_func(func1):print("time")definner1():print("frominner1")start_time=time.time()func1()stop_time=time.t 查看详情

pythonpython中基于类的装饰器的示例(代码片段)

查看详情

装饰器(代码片段)

一,什么是装饰器?装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。装饰器的应用场景:比如插入日志,性能测试,事务处理,缓存... 查看详情

装饰器的完整实现及原理(代码片段)

1、简单装饰器说明:代码在下边。装饰前后,我们都打印一遍如下内容,做一下对比。print(foo)      #打印当前函数对象print(foo.__name__) #打印foo函数的函数名print(foo.__doc__)  #打印foo函数的文档字符... 查看详情

python装饰器的一些小知识(代码片段)

调用时机装饰器的调用时机是在导入时,或者是加载时就执行,如下代码:register=[]defregester(func):print'runningregisster(0)'.format(func)register.append(func)returnfunc@regesterdeff1():print"runn 查看详情

装饰器进阶(代码片段)

---恢复内容开始---装饰器的形成的过程:最简单的装饰器,有返回值,有一个参数,万能参数装饰器的作用----不想修改函数的调用方式,但是还想再原来的函数前后添加功能装饰器的原则-----开放封闭式原则:开放--对外是开放... 查看详情

python中多个装饰器的执行顺序(代码片段)

python中多个装饰器的执行顺序:defwrapper1(f1):print('inwrapper1')definner1(*args,**kwargs):print('ininner1')ret=f1(*args,**kwargs)returnretreturninner1defwrapper2(f2):print('inwrapper2')de 查看详情

装饰器拓展(代码片段)

一:装饰器的缺点,解决方法正常的函数,可以使用内置方法打印函数名,注释等方便开发。deff(*args,**kwargs):"""这是一个测试装饰器的函数,没什么其他的用法:paramargs::paramkwargs::return:"""print("2018-06-04")print(f.__name__)print(f.__doc__)#f#... 查看详情