当前位置: 首页 > article >正文

python【装饰器】

装饰器(decorators)是 Python 中的一种高级功能,它允许动态地修改函数或类的行为。装饰器也称装饰函数,是一种闭包的应用:它接受一个函数作为参数,并返回一个新的函数或修改原来的函数

基本语法

其主要是用于某些函数需要拓展功能、但又不希望修改原函数;使用它可以简化代码、增强其可读性。装饰器不是必须要求被使用的,Python 中装饰器通过 @ 符号来进行标识。

【使用装饰器的基本步骤】

  1. 定义装饰函数(类)
  2. 定义业务函数
  3. 在业务函数上添加 @装饰函数(类)名

定义装饰器

装饰器的语法使用 @decorator_name 来应用在函数或方法上。Python 还提供了一些内置的装饰器,比如 @staticmethod 和 @classmethod,用于定义静态方法和类方法。装饰器允许在不修改原有函数代码的基础上,动态地增加或修改函数的功能。

# 定义装饰器
def decorator_function(original_function):
    # 内部函数:实际会被调用的新函数
    def wrapper(*args, **kwargs):
        # 这里是在调用原始函数前添加的新功能
        before_call_code()
        
        result = original_function(*args, **kwargs)
        
        # 这里是在调用原始函数后添加的新功能
        after_call_code()
        
        return result
    return wrapper

 

使用装饰器

装饰器通过 @ 符号应用在函数定义之前,如下:使用 @decorator_function 前缀在 target_function 定义前,Python会自动将 target_function 作为参数传递给 decorator_function,然后将返回的 wrapper 函数替换掉原来的 target_function。

# 使用装饰器
@decorator_function
# 业务函数
def target_function(arg1, arg2):
    pass  # 原始函数的实现

# 等同于:target_function = decorator_function(target_function)

带参数的装饰器

装饰器函数也可以接受参数,然后返回一个装饰器函数。

def repeat(n):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(n):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator

@repeat(3)    #greet 函数在被 @repeat(3) 装饰后,会打印三次问候语
def greet(name):
    print(f"Hello, {name}!")

greet("Alice")

类装饰器

除了函数装饰器,Python 还支持类装饰器。类装饰器是包含 __call__ 方法的类,它接受一个函数作为参数,并返回一个新的函数。

class Test(object):
    def __init__(self, func):
        print('函数名是 %s ' % func.__name__)
        self.__func = func
    def __call__(self, *args, **kwargs):
        self.__func()
@Test
def hello():
    print('Hello ...')
    
hello()

补充:

装饰器的应用场景

  • 日志记录: 装饰器可用于记录函数的调用信息、参数和返回值。
  • 性能分析: 可以使用装饰器来测量函数的执行时间。
  • 权限控制: 装饰器可用于限制对某些函数的访问权限。
  • 缓存: 装饰器可用于实现函数结果的缓存,以提高性能。

http://www.kler.cn/news/357021.html

相关文章:

  • python中_init_.py 到底有啥用?
  • nvm安装,node多版本管理
  • 多级缓存-案例导入说明
  • 自定义多级联动选择器指南(uni-app)
  • Spring Boot实现的电影评论系统开发
  • 开发工具(上)
  • 【数据结构与算法】第2课—数据结构之顺序表
  • 对于从vscode ssh到virtualBox的timeout记录
  • 【JavaScript】LeetCode:76-80
  • 【RestTemplate】重试机制详解
  • 生成式人工智能如何帮助我们更有效地传达信息
  • 《使用Gin框架构建分布式应用》阅读笔记:p88-p100
  • L1正则化详解
  • 【编程基础知识】《Java 基础探秘:return、break、continue、label、switch 与 enum 的深度解析》
  • 网络空间安全之一个WH的超前沿全栈技术深入学习之路(二:渗透测试行业术语扫盲)作者——LJS
  • 基于SpringBoot+Vue的读书笔记共享平台的设计与实现
  • 「言必信」电源滤波器的尺寸、重量在哪些场景中是重要考虑因素
  • Wails 学习笔记:Wails核心思想理解
  • 标题:中阳国际:智能化金融平台助力全球化投资
  • fetch、axios和ajax三种网络请求方式详解