首页 > 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 作为参数传给 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装饰器@的资料请关注其它相关文章!
原文链接:https://mp.weixin.qq.com/s/yY0tOqffjqOYeWbMbSUEiA