装饰器(decorators)是 Python 中的一种高级功能,它允许你动态地修改函数或类的行为。
装饰器是一种函数,它接受一个函数作为参数,并返回一个新的函数或修改原来的函数。
装饰器的语法使用 @decorator_name 来应用在函数或方法上。
Python 还提供了一些内置的装饰器,比如 @staticmethod 和 @classmethod,用于定义静态方法和类方法。
装饰器的应用场景:
基本语法
Python 装饰允许在不修改原有函数代码的基础上,动态地增加或修改函数的功能,装饰器本质上是一个接收函数作为输入并返回一个新的包装过后的函数的对象。
解析:decorator 是一个装饰器函数,它接受一个函数 func 作为参数,并返回一个内部函数 wrapper,在 wrapper 函数内部,你可以执行一些额外的操作,然后调用原始函数 func,并返回其结果。
使用装饰器
装饰器通过 @ 符号应用在函数定义之前,例如:
@time_logger def target_function(): pass
等同于:
def target_function(): pass target_function = time_logger(target_function)
这会将 target_function 函数传递给 decorator 装饰器,并将返回的函数重新赋值给 target_function。从而,每次调用 target_function 时,实际上是调用了经过装饰器处理后的函数。
通过装饰器,开发者可以在保持代码整洁的同时,灵活且高效地扩展程序的功能。
以下是一个简单的装饰器示例,它会在函数执行前后打印日志:
输出:
在原函数之前执行 Hello! 在原函数之后执行
带参数的装饰器
如果原函数需要参数,可以在装饰器的 wrapper 函数中传递参数:
以上代码代码定义了一个装饰器 my_decorator,它会在被装饰的函数执行前后分别打印一条消息。装饰器通过 wrapper 函数包裹原函数,并在调用原函数前后添加额外操作。
在原函数之前执行 Hello, Alice! 在原函数之后执行
装饰器本身也可以接受参数,此时需要额外定义一个外层函数:
repeat 函数是一个装饰器工厂,它接受一个参数 num_times,返回一个装饰器 decorator。decorator 接受一个函数 func,并返回一个 wrapper 函数。wrapper 函数会调用 func 函数 num_times 次。使用 @repeat(3) 装饰s ay_hell 函数后,调用 say_hello 会打印 "Hello!" 三次。
Hello! Hello! Hello!
类装饰器
除了函数装饰器,Python 还支持类装饰器。
类装饰器(Class Decorator)是一种用于动态修改类行为的装饰器,它接收一个类作为参数,并返回一个新的类或修改后的类。
类装饰器可以用于:
类装饰器有两种常见形式:
函数形式的类装饰器
以下实例给类添加日志功能:
调用 MyClass.display() 前 这是 MyClass 的 display 方法 调用 MyClass.display() 后
类形式的类装饰器(实现 __call__ 方法)
以下实例实现单例模式(Singleton):
Database 初始化 True
内置装饰器
Python 提供了一些内置的装饰器,例如:
@staticmethod: 将方法定义为静态方法,不需要实例化类即可调用。
@classmethod: 将方法定义为类方法,第一个参数是类本身(通常命名为 cls)。
@property: 将方法转换为属性,使其可以像属性一样访问。
多个装饰器的堆叠
你可以将多个装饰器堆叠在一起,它们会按照从下到上的顺序依次应用。例如:
Decorator 1 Decorator 2 Hello!