> 文档中心 > Python零基础入门篇 - 36 - 装饰器与类的装饰器

Python零基础入门篇 - 36 - 装饰器与类的装饰器

哈士奇兄的这篇文章,主题是“装饰器”,说白了就是给函数穿个“马甲”,让它更时髦、更实用。装饰器的核心思想是:通过接收一个函数,对其进行“加工”,然后返回一个新的函数。这就像你给一件普通T恤加了印花,它立马变得个性十足。

装饰器有啥用?
首先,装饰器能让代码更简洁、更优雅。比如,你想给多个函数加上日志记录功能,直接写个装饰器,一“套”搞定,不用每个函数都去改代码。其次,装饰器能增强函数的功能,比如权限验证、缓存、性能监控等。可以说,装饰器是Python编程中的“瑞士军刀”。

装饰器怎么用?
哈士奇兄提到了两种用法:一种是把函数当参数传给装饰器,另一种是用@符号直接“绑定”到函数上。我个人更推荐第二种,因为写法简洁,一目了然。想象一下,你给函数贴了个标签,告诉它:“嘿,现在你是个有特殊功能的函数了!”

装饰器的局限?
虽然装饰器很强大,但也有局限性。比如,装饰器会改变函数的元信息(比如__name__属性),可能会影响调试。不过,Python提供了functools.wraps来解决这个问题。另外,过度使用装饰器会让代码变得难以理解,所以还是要适度。

总之,装饰器是Python编程中的“魔法道具”,用得好,能让代码既优雅又高效。但别忘了,魔法也要有节制,否则容易“失控”。希望哈士奇兄的分享能让大家对装饰器有更深的理解,写出更棒的代码!🚀

前言
✌ 作者简介:渴望力量的哈士奇,大家可以叫我 🐶哈士奇🐶 。(我真的养了一只哈士奇)
📑 个人主页:渴望力量的哈士奇主页
📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥 如果感觉博主的文章还不错的话,还请不吝👍关注、点赞、收藏三连支持👍一下博主哦
💬 人生格言:优于别人,并不高贵,真正的高贵应该是优于过去的自己。💬

📕系列专栏::
               👍 Python全栈系列 - [更新中]    ➡️➡️➡️ 【 本文在该系列】
               👋 网安之路系列
​                       🍋 网安之路踩坑篇
​                       🍋 网安知识扫盲篇
​                       🍋 Vulhub 漏洞复现篇
​                       🍋 Shell脚本编程篇
​                       🍋 Web攻防篇  ➡️➡️➡️ 2021年9月3日停止更新,转战先知等安全社区
​                       🍋 渗透工具使用集锦  ➡️➡️➡️ 2021年9月3日停止更新,转战先知等安全社区
​                ⭐️ 点点点工程师系列
​                       🍹 测试神器 - Charles 篇
​                       🍹 测试神器 - Fiddler 篇
​                       🍹 测试神器 - Jmeter 篇
​                       🍹 自动化 - RobotFrameWork 系列
​                       🍹 自动化 - 基于 JAVA 实现的WEB端UI自动化

🎉🎉欢迎持续关注🎉🎉

Python零基础入门篇 - 36 - 装饰器与类的装饰器

文章目录

    • 装饰器
      • 装饰器的定义
      • 装饰器的用法
    • 类中的装饰器
      • 类的装饰器 - classmethod
      • 类的装饰器 - staticmethod
      • 类的装饰器 - property

通过学习装饰器可以让我们更好更灵活的使用函数,通过学会使用装饰器还可以让我们的代码更加优雅。

在我们的实际工作中,很多场景都会用到装饰器,比如记录一些日志、或者屏蔽一些不太合法的程序执行从而使我们的代码更加安全。

装饰器

什么是装饰器?虽然对这个次感到陌生,但是完全不需要担心。

  • 首先,装饰器也是一种函数;只不过装饰器可以接收 函数 作为参数来传递。
  • 并且可以通过 return 可以返回一个函数,装饰器通过接收一个函数,对它在装饰器内部进行处理、调用,并返回一个新的函数,同时还可以动态增强传入函数的功能。
  • 装饰器整个流程是这样的:
    • A函数是装饰器,B函数是A函数传入的参数。
    • 将B函数在A函数中执行,在A函数中可以选择执行或不执行,也可以对B函数的结果进行二次加工处理。

接下来我们看看 装饰器长什么样子

def a(): def b(): print(helloworld)     b() a()b()

a() 函数中书写了一个 b() 函数,并在 a() 函数中调用 b() 函数。是不是非常类似在类中定义一个局部函数并调用的例子?其实装饰器就是有些类似这样的操作,只不过被装饰器调用的函数是通过 参数 的形式传进去,并在 b() 函数中执行。

我们在定义完 a() 函数之后进行调用,可以正常处理。但是 b() 函数 是 a() 函数的局部函数 如果在外部调用会报错。(如上文中的第十行,就会报错)

装饰器的定义

示例如下:

def out(func_args):# 装饰器的第一层函数被称为 外围函数 , 'func_args' 为要处理的函数 def inter(*args, kwargs):# 外围函数 的函数体内定义的函数被称为 内嵌函数 ;传入的参数为要处理的 func_args 函数的参数 # 这里我们并不知道 func_args 函数需要传入进来的参数是什么,所以目前写传入可变参数是比较合理的 return func_args(*args, kwargs)# 在 内嵌函数 的函数体内调用 func_args 函数,并将可变参数传入    # 其实这里我们可以处理更多的逻辑; # 我们可以选择执行或者不执行,甚至可以func_args 函数的执行结果进行二次处理     return inter # 书写完 内嵌函数的业务之后,我们在 外围函数体内返回 内嵌函数# 需要注意的是,这里是不执行的(因为没有加括号),这是装饰器的定义规则,是必不可少的    # 只有外围函数返回内嵌函数,才可以被之后的代码执行;(因为所有的业务都在内嵌函数中,不返回就无法执行调用)

装饰器的用法

在我们日常工作中,装饰器的使用方法有两种。

第一种:将被调用的函数直接作用为参数传入装饰器的外围函数括弧内;示例如下:

def a(func): def b(*args, kwargs): return func(*args, kwargs) return bdef c(name):    print(name)    a(c)('Neo')# >>> 执行结果如下:# >>> Neo

第二种:将装饰器与被调用函数绑定在一起, @ 符号 + 装饰器函数放在被调用函数的上一行,被调用的函数正常定义,只需要直接调用被执行函数即可。示例如下:

def a(func): def b(*args, kwargs): return func