python装饰器的原理--装饰器过程
admin
2023-02-15 05:00:06
0

  装饰器的定义

  就是给已有函数增加额外功能的函数,它本质上就是一个闭包函数。

  装饰器的功能特点:

  不修改已有函数的源代码

  不修改已有函数的调用方式

  给已有函数增加额外的功能

  在这里我们使用装饰器实现已有函数执行时间的统计的代码来讲解一些它的原理

  方式一:

  import time

  def show():

  start = time.time()

  print("show run...")

  stop = time.time()

  print("一共耗时 %s 秒" % (stop-start))

  def count_number():

  start = time.time()

  s = 0

  for i in range(1000000):

  s += i

  print(s)

  stop = time.time()

  print("一共耗时 %s 秒" % (stop-start))

  show()

  count_number()

  方式一的代码虽然可以实现功能,但我们会发现代码太冗余,定义的两个函数都要写一遍计时功能,代码的重用性不高,所以这方法不好.

  方式二:

  import time

  def count_time(func):

  start = time.time()

  func()

  stop = time.time()

  print("一共耗时 %s 秒" % (stop-start))

  def show():

  print("show run...")

  def count_number():

  s = 0

  for i in range(1000000):

  s += i

  print(s)

  count_time(show)

  count_time(count_number)

  方式二 封装了一个计时的函数,代码量虽然减少了很多,但是你会发现,我们在调用函数的时候,调用方式不一样,所以这个方法也不好,它修改了函数的使用方式,如果在实际开发中,你不需要计时功能了.那你还需要改,就很麻烦.

  方式三:

  def count_time(func):

  def inner():

  start = time.time()

  func()

  stop = time.time()

  print("一共耗时 %s 秒" % (stop-start))

  return inner

  def show():

  print("show run...")

  def count_number():

  s = 0

  for i in range(1000000):

  s += i

  print(s)

  # 这句话就是装饰器的原理

  show = count_time(show)

  # count_time(show) 单看这就是一个函数调用,

  # 我们把show传给了count_time也就是show = func

  # 所以count_time 函数中调用的 func()就相当于调用

  # show(),因此这个闭包既帮我们完成了计时又完成了show

  # 函数的调用,下面的count_number是一样的原理

  count_number = count_time(count_number)

  show()

  count_number()

  show = count_time(show)

  count_number = count_time(count_number)

  以上的代码,是装饰器的原理.我们必须能够理解,这是把 show 函数在内存当中的引用给了count_time

  方式三的简写:郑州妇科医院 http://www.sptdfk.com/

  如果有多个函数都需要添加登录验证的功能,每次都需要编写show = count_time(show)这样代码对已有函数进行装饰,这种做法还是比较麻烦。

  Python给提供了一个装饰函数更加简单的写法,那就是语法糖,语法糖的书写格式是: @装饰器名字,通过语法糖的方式也可以完成对已有函数的装饰

  def count_time(func):

  def inner():

  start = time.time()

  func()

  stop = time.time()

  print("一共耗时 %s 秒" % (stop-start))

  return inner

  # 使用语法糖方式来装饰函数

  @count_time # 等价于 show = count_time(show)

  def show():

  print("show run...")

  @count_time

  # 等价于 count_number = count_time(count_number)

  def count_number():

  s = 0

  for i in range(1000000):

  s += i

  print(s)

  show()

  count_number()

  装饰器的执行时间是加载模块时立即执行

  我们需要注意:

  闭包函数有且只有一个参数,必须是函数类型,这样定义的函 数才是装饰器。

  写代码要遵循开放封闭原则,它规定已经实现的功能代码不允许被修改,但可以被扩展。

相关内容

热门资讯

身高缩了,房子小了,胆子也怯了... 据日经中文网7月24日报道,日本经济长期停滞催生了“不断缩小”的社会倾向,近年来日本人的平均身高持续...
广东省内铁路即将全线停运 作者 | 第一财经 南英今年第12号台风“红霞”已于7月24日凌晨生成,预计25日夜间至26日早晨在...
中美频繁高层互动,菲律宾好自为... 7月24日,菲律宾组织7艘公务船、3艘海警舰、1艘运鱼船,并唆使大量渔船位中国黄岩岛管辖海域非法聚集...
被要求补税2250万欧元的法国... ·贝尔纳·阿尔诺。(LVMH官网)他的“帝国”离不开这个国家的形象加持,而这个国家,也早已吃定了这一...
通派龙湖御潮云上:当极核地段遇... 在2026年的郑州楼市版图中,如果要寻找一个能够同时承载“主城确定性”与“产品革新力”的坐标,通派龙...
追光引路人—记国家级线上线下混... 人物名片:吴建丽,教授,黄河科技学院医学部教师。主持国家级线上线下混合式一流课程1门、河南省线上线下...
加总理表态:若谈判破裂,会对美... 据凤凰卫视报道,7月23日,加拿大总理卡尼与各省省长和地区领导人举行会议,商讨应对美国最新一轮关税威...
从北京望中东:和平,虽远在中国... ◆笔者参与的分论坛“维护中东和平:挑战与出路”正在进行中。今年7月举行的第十四届世界和平论坛上,中东...
巨大冲击!美国AI“闭源高价售... 日本计算机社会学专家塚越健司7月24日发表题为《中国AI“Kimi K3”引发巨大冲击——撼动美国A...
人民锐评:中国籍数学家首获全球... 历史性的突破!日前,第二十一届菲尔兹奖得主名单揭晓,北大2007级本科校友王虹、邓煜双双获奖,无数网...