Python 装饰器是怎么写的

这篇具有很好参考价值的文章主要介绍了Python 装饰器是怎么写的。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

其实我们已经创建了一个装饰器! 一切皆对象,那是我的对象
现在我们修改下上一个装饰器,并编写一个稍微更有用点的程序:

def a_new_decorator(a_func):
  def wrapTheFunction():
      print("I am doing some boring work before executing a_func()"
      a_func()
      print("I am doing some boring work after executing a_func()"
  return wrapTheFunction

def a_function_requiring_decoration():
    print("I am the function which needs some decoration to remove my foul smell"

a_function_requiring_decoration()
#outputs: "I am the function which needs some decoration to remove my foul smell"

a_function_requiring_decoration = a_new_decorator(a_function_requiring_decoration)
#now a_function_requiring_decoration is wrapped by wrapTheFunction()

a_function_requiring_decoration()
#outputs:I am doing some boring work before executing a_func()
# I am the function which needs some decoration to remove my foul smell
# I am doing some boring work after executing a_func()

这正是 Python 中装饰器做的事情!
它 们封装一个函数,并且这样或者那样的方式来修改它的行。现在你也许疑惑,我们在代码里并没有使用@符号?那只是一个简短的方式来生成一个被装饰的函数。
这里是我们如何使用@来运行之前的代码:

@a_new_decorator
def a_function_requiring_decoration():
    """Hey you! Decorate me!"""
    print("I am the function which needs some decoration to "
          "remove my foul smell")
 
 a_function_requiring_decoration()
#outputs: I am doing some boring work before executing a_func()
# I am the function which needs some decoration to remove my foul smell
# I am doing some boring work after executing a_func()
#the @a_new_decorator is just a short way of saying:
a_function_requiring_decoration = a_new_decorator(a_function_requiri

希望你现在对 Python 装饰器的工作原理有个基本的理解。

如果我们运行如下代码会存在 一个问题:

print(a_function_requiring_decoration.__name__)
# Output: wrapTheFunction

这并不是我们想要的!
Ouput输出应该是“a_function_requiring_decoration”。这里的函数被 warpTheFunction替代了。它重写了我们函数的名字和注释文档(docstring)。幸运的是 Python提供给我们一个简单的函数来解决这个问题,那就是functools.wraps。
我们修改上一个例子来使用functools.wraps:

from functools import wraps

def a_new_decorator(a_func):
    @wraps(a_func)
    def wrapTheFunction():
        print("I am doing some boring work before executing a_func()"
        a_func()
        print("I am doing some boring work after executing a_func()"
    return wrapTheFunction

@a_new_decorator
def a_function_requiring_decoration():
    """Hey yo! Decorate me!"""
    print("I am the function which needs some decoration to "
          "remove my foul smell")
print(a_function_requiring_decoration.__name__)
# Output: a_function_requiring_decoration

现在好多了。

我们接下来学习装饰器的一些常用场景。

from functools import wraps

def decorator_name(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        if not can_run:
            return "Function will not run"
        return f(*args, **kwargs)
     return decorated
     
@decorator_name
def func():
    return("Function is running")

can_run = True
print(func())
# Output: Function is running
can_run = False
print(func())
# Output: Function will not run

注意:@wraps接受一个函数来进行装饰,并加个了复制函数名称、注释文档、参数列表 等等的功能。这可以让我们在装饰器里面访问在装饰之前的函数的属性。文章来源地址https://www.toymoban.com/news/detail-431180.html

到了这里,关于Python 装饰器是怎么写的的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 明明我们已经安装了第三方库,可是import时却ModuleNotFoundError报错的解决办法

    明明我们已经安装了第三方库,可是用IDLE进行import时却ModuleNotFoundError: No module named \\\'requests’报错 这是因为大家的第三方库多是通过pycharm进行安装的,他的安装位置和python软件的安装位置不一致,而pycharm是按照项目来管理第三方库的。 解决办法就是: 第一步:先找到pytho

    2024年02月11日
    浏览(72)
  • 怎么去除视频里的背景音乐?其实非常简单!

    如何去除视频背景音乐?在视频处理中,有时我们需要从视频中提取声音并进行处理,而不仅仅是简单地去除整个背景音乐。我们可能需要有选择性地去除人声或背景音乐。这个处理过程对于选用合适的工具至关重要。在本文中,我将分享两种可用于去除视频背景音乐的工具

    2024年02月14日
    浏览(46)
  • 【人工智能】MAAS 模型即服务:概念、应用场景、优势、挑战等 —— 我们人类已经进入人工智能大模型时代

    目录 导言 一、MAAS概述 二、MAAS的应用场景 1. 自然语言处理(NLP)

    2024年02月06日
    浏览(65)
  • 很火的AI换脸怎么做的?方法其实非常简单

    网上很火的AI换脸是怎么做到的呢?将自己的脸部特征换到名人照片中,可以让我们看到自己和名人的组合效果如何,还可以将自己的脸部特征换到历史人物的照片中,看看自己是否有历史人物的气质,这种操作也非常有趣。看看自己是否适应不同的文化氛围,这也是一种非

    2024年02月11日
    浏览(51)
  • 加密的PDF怎么解密?其实很简单,只要掌握这个技巧

    如今大家在工作中或学习中,使用频率较高的文档格式就是PDF,因为它具有较高的稳定性,在传输过程中不会发生内容排版错乱等现象。而有时我们为了保护PDF文件里的内容信息,就需要对其使用加密处理,避免他人未经授权进行查看。 可当大家要对该文档进行打印或编辑时

    2024年02月11日
    浏览(48)
  • dxf怎么转换成PDF格式?转换方法其实很简单

    PDF文件是一种可靠的文件格式,可以在各种操作系统和软件上打开和查看。而dxf是CAD文件的一种格式,打开它一般都是需要相关的操作软件才能打开,不是特别方便,将dxf文件转换成PDF格式就可以很好的解决这一问题,下面教大家几种简单方法,一起来学习下吧。   工具一:

    2024年02月16日
    浏览(37)
  • 怎么提取视频中的音乐保存到本地?其实方法很简单

    当你想要使用视频中的音乐时,你可以考虑将它从视频中提取出来。这可以用于制作音频样本集,制作铃声或其他音频素材,或者向其他人展示视频的音乐部分而无需显示视频本身。如果你是一位音乐制作人员,你可能会需要一些特定类型的音效,这时提取视频中的音乐可以

    2024年02月10日
    浏览(58)
  • python怎么创建新文件(python怎么创建文件代码)

    在使用Python进行开发时,创建新文件是一个非常常见的操作。无论是编写日志文件、数据存储文件还是其他类型的文件,创建新文件都是必不可少的工作之一。下面将介绍几种简单而有效的方法,帮助你快速创建新文件。 Python内置了一个名为open的函数,它可以用于创建、打

    2024年02月08日
    浏览(39)
  • 携程大牛的单元测试是怎么样写的?

    大家都知道,开发软件的时候为代码编写 单元测试 是很好的。但实际上,光有测试还不够,还要编写好的测试,这同样重要。 要做到这一点,考虑遵循一些固执的原则,对测试代码给予一些关爱: 1. 保持测试代码的紧凑和可读性 要做到这一点,应该要进行毫不留情的重构

    2024年04月12日
    浏览(41)
  • 携程总监的单元测试是怎么样写的?

      大家都知道,开发软件的时候为代码编写单元测试是很好的。但实际上,光有测试还不够,还要编写好的测试,这同样重要。 要做到这一点,考虑遵循一些固执的原则,对测试代码给予一些关爱: 要做到这一点,应该要进行毫不留情的重构,就像对生产代码应该做的那样

    2024年02月03日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包