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装饰器@的资料请关注脚本之家其它相关文章!