文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python中修饰器的作用是什么

2023-06-14 16:34

关注

今天就跟大家聊聊有关python中修饰器的作用是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

python有哪些常用库

python常用的库:1.requesuts;2.scrapy;3.pillow;4.twisted;5.numpy;6.matplotlib;7.pygama;8.ipyhton等。

我们首先从一个简单的例子说起,这个例子是stackflow上的一个问题,如何通过使用如下的代码实现输出<b><i>Hello</i></b>:

@makebold  @makeitalic  def say():     return "Hello"

先看一下答案:

def makebold(fn):      def wrapped():          return "<b>" + fn() + "</b>"      return wrapped     def makeitalic(fn):      def wrapped():          return "<i>" + fn() + "</i>"      return wrapped    @makebold  @makeitalic  def hello():      return "hello world"       print hello()     #返回 <b><i>hello world</i></b>

这里的@makebold和@makeitalic似乎给Hello加上了一层包装(or修饰),这就是修饰器最明显的体现。

从需求谈起

初期,我写了一个函数

def foo():      print 'in foo()'  foo()

为了检查这个函数的复杂度(在网络编程中程序的延时还是很重要的),需要测算运算时间,增加了计算时间的功能有了下面的代码:

import time  def foo():      start = time.clock()      print 'in foo()'      end = time.clock()      print 'Time Elapsed:', end - start     foo()

这里只是写了一个函数,如果我想测量多个函数的延时,由于必须知道start与end,所以必须写在程序的开头与结尾,难道每一个程序都这样复制粘贴么?固然可行,但是,我们可以通过设计模式中将功能与数据部分分离一样,将这个测量时间的函数分离出去,就像C++中我们可以将这个测量时间的函数变为一个类,通过调用这个类,赋予不同的函数来测量不同的函数的运行时长。在python中,由于函数实际上就是对象,所以可以利用类似的方法实现:

import time     def foo():      print 'in foo()'     def timeit(func):      start = time.clock()      func()      end =time.clock()      print 'Time Elapsed:', end - start     timeit(foo)

这里func()就可以指定函数了,但是如果我不想填这个函数或者这个功能函数并不能修改成类似的形式怎么办?我们需要的是最大限度的少改动:

import time     def foo():          print 'in foo()'     # 定义一个计时器,传入一个,并返回另一个附加了计时功能的方法  def timeit(func):                 # 定义一个内嵌的包装函数,给传入的函数加上计时功能的包装           def wrapper():                   start = time.clock()                   func()                   end =time.clock()                   print 'Time Elapsed:', end - start              # 将包装后的函数返回           return wrapper      foo = timeit (foo)    #可以直接写成@timeit + foo定义,python的"语法糖"foo() #在这个代码中,timeit(foo)不是直接产生调用效果,而是返回一个与foo参数列表一致的函数,此时此foo非彼foo!因为此时的foo具有了timeit的功效,简单来说就是能够让你在装饰前后执行代码而无须改变函数本身内容,装饰器是一个函数,而其参数为另外一个函数。 #一个有趣的"汉堡"让你了解顺序 #顺序在修饰器还是非常重要的,利用一个代码展示一下:def bread(func) :          def wrapper() :                  print "</'''       '''\>"                  func()                  print "<\______/>"          return wrapper     def ingredients(func) :          def wrapper() :                  print "#tomatoes#"                  func()                  print "~salad~"          return wrapper     def sandwich(food="--ham--") :          print food         sandwich()  #输出 : --ham--  sandwich = bread(ingredients(sandwich))  sandwich()   #输出:  #</'''       '''\>     #tomatoes#    # --ham--   # ~salad~    #<\______/>

加上语法,代码可以更简洁:

def bread(func) :      def wrapper() :          print "</'''       '''\>"          func()          print "<\______/>"      return wrapper     def ingredients(func) :      def wrapper() :          print "#tomatoes#"          func()          print "~salad~"      return wrapper  @bread  @ingredients  def sandwich(food="--ham--") :      print food     sandwich()

看完上述内容,你们对python中修饰器的作用是什么有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网行业资讯频道,感谢大家的支持。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯