python装饰器"@"使用实例深入探究

 更新时间:2024年01月08日 11:32:52   作者:码头青年人  
这篇文章主要为大家介绍了python装饰器"@"使用实例深入探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

基础语法

装饰器是 Python 中一种强大且灵活的特性,用于修改或扩展函数或方法的行为。装饰器本质上是一个函数,它接收一个函数作为参数,并返回一个新的函数或可调用对象。

举例:

def funA(func):
   def wrapper():
       print("itmatou")
       func()
       print("itmatou2")
   return wrapper

@funA
def funB():
   print("Hello!")

funB()

其输出结果为:

itmatou
Hello!
itmatou2

分析:

在这个例子中,funA 是一个简单的装饰器函数,它接收一个函数 func,然后返回一个新的函数 wrapper。通过在 funB 函数定义上使用 @funA 语法,实际上相当于执行了 funB = funA(funB)。调用 funB 时,实际上是调用了 wrapper 函数。

  • 将 funB 作为参数传给 funA 函数;
  • 将 funA 函数执行完成的返回值反馈回 funB。
  • 等价于:funB = funA(funB)

带参数的装饰器

funB() 函数无参数时,直接将 funB() 作为 funA() 的参数传入。如果当 funB() 函数带有参数时,应该如何传值那?

举例:

def funA(func):
   def wrapper(say):
       print("itmatou:", say)
   return wrapper
@funA
def funB(say):
   print("Hello!")
funB("hello")

其输出结果为:

itmatou: hello

在实际应用中,装饰器 funA 是提前写好的,并不确认调用它的函数带有几个参数,所以这里用到*args, **kwargs

*args是一个特殊的参数,在函数定义时以星号开头,用于传递不确定数量的位置参数。作为一个元组(tuple)处理。

**kwargs是另一个特殊的参数,在函数定义时以两个星号开头,用于传递不确定数量的关键字参数。作为一个字典(dict)来处理。

举例:

def funA(func):
   def wrapper(*args, **kwargs):
       func(*args, **kwargs)
   return wrapper
@funA
def funB(say):
   print("Hello!", say)
@funA
def funC(say, say1):
   print("Hello!", say, say1)
funB("我是B")
funC("我是C", "CC")

其输出结果为:

Hello! 我是B
Hello! 我是C CC

装饰器本身也可以接收参数:

举例:

def funA_with_args(arg):
   def funA(func):
       def wrapper(*args, **kwargs):
           print(arg)
           func(*args, **kwargs)
       return wrapper
   return funA
@funA_with_args("我是装饰器自带的参数")
def funB(say):
   print("Hello!", say)
funB("我是B")

其输出结果为:

Hello! 我是B
Hello! 我是C CC

函数装饰器还可以嵌套:

举例:

@funA
@funB
@funC
def fun():
   ###

其执行顺序相当于:

fun = funA(funB(funC(fun)))

类装饰器

除了函数装饰器,你还可以使用类作为装饰器。类装饰器需要实现__call__方法。

举例:

class MyDecorator:
   def __init__(self, func):
       self.func = func

   def __call__(self, *args, **kwargs):
       print("itmatou")
       self.func(*args, **kwargs)
       print("itmatou1")

@MyDecorator
def say_hello():
   print("Hello!")

say_hello()

其输出结果为:

itmatou
Hello!
itmatou1

内置装饰器

Python 还提供了一些内置的装饰器,如 @staticmethod、@classmethod 等,用于修饰静态方法和类方法。

class MyClass:
   @staticmethod
   def static_method():
       print("Static method.")

   @classmethod
   def class_method(cls):
       print("Class method.")

MyClass.static_method()
MyClass.class_method()

这只是装饰器的基础,你可以根据需要使用装饰器来实现各种功能,比如性能分析、日志记录、权限检查等。装饰器是 Python 中非常强大和灵活的工具

以上就是python装饰器"@"使用实例深入探究的详细内容,更多关于python装饰器@的资料请关注脚本之家其它相关文章!

相关文章

  • Scrapy爬虫框架集成selenium及全面详细讲解

    Scrapy爬虫框架集成selenium及全面详细讲解

    这篇文章主要为大家介绍了Scrapy集成selenium,以及scarpy爬虫框架全面讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • 浅析Python实现DFA算法

    浅析Python实现DFA算法

    DFA全称为Deterministic Finite Automaton,即确定有穷自动机。特征:有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边标记有一个符号,其中一个状态是初态,某些状态是终态。不同于不确定的有限自动机,DFA中不会有从同一状态出发的两条边标志有相同的符号
    2021-06-06
  • python基础之函数的定义和调用

    python基础之函数的定义和调用

    这篇文章主要介绍了python函数的定义和调用,实例分析了Python中返回一个返回值与多个返回值的方法,需要的朋友可以参考下
    2021-10-10
  • python中的decorator的作用详解

    python中的decorator的作用详解

    这篇文章主要介绍了python中的decorator的作用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • 使用Django xadmin 实现修改时间选择器为不可输入状态

    使用Django xadmin 实现修改时间选择器为不可输入状态

    这篇文章主要介绍了使用Django xadmin 实现修改时间选择器为不可输入状态,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Pygame如何使用精灵和碰撞检测

    Pygame如何使用精灵和碰撞检测

    本文主要介绍了Pygame如何使用精灵和碰撞检测,它们能够帮助我们跟踪屏幕上移动的大量图像。我们还会了解如何检测两个图像相互重叠或者碰撞的方法。
    2021-11-11
  • python人工智能tensorflow构建循环神经网络RNN

    python人工智能tensorflow构建循环神经网络RNN

    这篇文章主要为大家介绍了python人工智能tensorflow构建循环神经网络RNN,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 如何通过神经网络实现线性回归的拟合

    如何通过神经网络实现线性回归的拟合

    这篇文章主要介绍了如何通过神经网络实现线性回归的拟合问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • 如何用Python中19行代码把照片写入到Excel中

    如何用Python中19行代码把照片写入到Excel中

    这篇文章主要介绍了如何利用Python3中的19行代码把照片写入到Excel中,文章内容实现的不是截取一张图片,粘贴到excel,而是通过像素写入到excel中,需要的朋友可以参考一下
    2022-02-02
  • python3实现名片管理系统

    python3实现名片管理系统

    这篇文章主要为大家详细介绍了python3实现名片管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11

最新评论