python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python装饰器@

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

作者:码头青年人

这篇文章主要为大家介绍了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() 函数无参数时,直接将 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装饰器@的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文