探索Python装饰器:优雅地增强函数功能

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 探索Python装饰器:优雅地增强函数功能

Python 装饰器是一种高级功能,允许你在不修改原始函数代码的情况下,动态地修改或扩展函数的行为。

基本语法

装饰器是一种特殊的函数,其基本语法如下:

def decorator_function(func):
    def wrapper(*args, **kwargs):
        # 在调用原始函数之前的操作
        result = func(*args, **kwargs)
        # 在调用原始函数之后的操作
        return result
    return wrapper

常用命令

  • @decorator_function:将装饰器应用到函数上的语法糖。
  • decorator_function:装饰器函数本身。

示例

示例 1:简单装饰器
def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper
@my_decorator
def say_hello():
    print("Hello!")
say_hello()
示例 2:带参数的装饰器
def repeat(num_times):
    def decorator_repeat(func):
        def wrapper(*args, **kwargs):
            for _ in range(num_times):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator_repeat
@repeat(num_times=3)
def greet(name):
    print(f"Hello {name}")
greet("Alice")

应用场景

1. 日志记录

装饰器在日志记录中发挥着重要作用,它可以捕获函数的输入参数、执行时间以及输出结果,从而方便开发人员跟踪函数的执行过程和调试代码。通过装饰器记录日志,可以提高代码的可读性和可维护性。

示例代码

import logging
import time
def log_decorator(func):
    def wrapper(*args, **kwargs):
        logging.info(f"Calling function {func.__name__} with args: {args}, kwargs: {kwargs}")
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        logging.info(f"Function {func.__name__} executed in {end_time - start_time} seconds with result: {result}")
        return result
    return wrapper
@log_decorator
def add(x, y):
    return x + y
result = add(3, 5)
print("Result:", result)
2. 性能监控

装饰器在性能监控方面也具有重要作用,它可以帮助开发人员监控函数的执行时间,发现潜在的性能瓶颈并进行优化。通过装饰器进行性能监控,可以提高代码的效率和性能。

示例代码

import time
def performance_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Function {func.__name__} executed in {end_time - start_time} seconds")
        return result
    return wrapper
@performance_decorator
def calculate_factorial(n):
    factorial = 1
    for i in range(1, n + 1):
        factorial *= i
    return factorial
result = calculate_factorial(10)
print("Factorial:", result)
3. 权限验证

装饰器可以用于权限验证,例如检查用户是否具有执行特定操作的权限。这种方式使得权限验证逻辑与业务逻辑分离,提高了代码的模块化和可维护性。

示例代码

def permission_required(permission):
    def decorator(func):
        def wrapper(*args, **kwargs):
            if check_permission(permission):
                return func(*args, **kwargs)
            else:
                raise PermissionError("Permission denied")
        return wrapper
    return decorator
def check_permission(permission):
    # 检查用户是否具有指定权限的逻辑
    return True  # 此处仅为示例,实际需根据业务逻辑实现
@permission_required("admin")
def delete_user(user_id):
    # 删除用户的逻辑
    print(f"User {user_id} deleted successfully")
delete_user(123)

注意事项

1. 装饰器顺序

当多个装饰器应用于同一个函数时,它们的执行顺序与它们在代码中的顺序相反。这意味着最先定义的装饰器实际上会最后执行,而最后定义的装饰器会最先执行。

示例代码

def decorator1(func):
    def wrapper():
        print("Decorator 1 executed")
        func()
    return wrapper
def decorator2(func):
    def wrapper():
        print("Decorator 2 executed")
        func()
    return wrapper
@decorator1
@decorator2
def greet():
    print("Hello!")
greet()

输出结果为:

Decorator 1 executed
Decorator 2 executed
Hello!
2. 装饰器的参数

如果装饰器本身需要接受参数,则需要在装饰器函数外再包裹一层函数。这样的装饰器称为带参数的装饰器。在定义带参数的装饰器时,外层函数接受装饰器参数,内层函数接受被装饰函数。

示例代码

def decorator_with_param(param):
    def decorator(func):
        def wrapper():
            print(f"Decorator with parameter {param} executed")
            func()
        return wrapper
    return decorator
@decorator_with_param("test")
def greet():
    print("Hello!")
greet()

输出结果为:

Decorator with parameter test executed
Hello!

总结

装饰器是 Python 中一种强大的工具,可用于动态修改函数的行为,常用于日志记录、性能监控、权限验证等场景。通过合理使用装饰器,可以提高代码的灵活性、可重用性和可维护性。

相关实践学习
日志服务之数据清洗与入湖
本教程介绍如何使用日志服务接入NGINX模拟数据,通过数据加工对数据进行清洗并归档至OSS中进行存储。
相关文章
|
7天前
|
缓存 监控 程序员
Python中的装饰器是一种特殊类型的声明,它允许程序员在不修改原有函数或类代码的基础上,通过在函数定义前添加额外的逻辑来增强或修改其行为。
【6月更文挑战第30天】Python装饰器是无侵入性地增强函数行为的工具,它们是接收函数并返回新函数的可调用对象。通过`@decorator`语法,可以在不修改原函数代码的情况下,添加如日志、性能监控等功能。装饰器促进代码复用、模块化,并保持源代码整洁。例如,`timer_decorator`能测量函数运行时间,展示其灵活性。
16 0
|
2天前
|
Python
python解包字典到函数参数
【7月更文挑战第5天】
6 2
|
3天前
|
自然语言处理 Python
从菜鸟到大神,一篇文章带你玩转Python闭包与装饰器的深度应用
【7月更文挑战第4天】Python中的闭包和装饰器是增强代码优雅性的关键特性。闭包是能访问外部作用域变量的内部函数,如示例中的`inner_function`。装饰器则是接收函数并返回新函数的函数,用于扩展功能,如`my_decorator`。装饰器可与闭包结合,如`repeat`装饰器,它使用闭包记住参数并在调用时重复执行原函数。这些概念提升了代码复用和可维护性。
|
3天前
|
语音技术 开发者 Python
语音识别,python运行H ~W~,要使用英符,执行Python的流程是输入Python,回车,解释器的两大功能,翻译代码,提交计算机运算,多行代码运行,写一个py文件,pycharm安
语音识别,python运行H ~W~,要使用英符,执行Python的流程是输入Python,回车,解释器的两大功能,翻译代码,提交计算机运算,多行代码运行,写一个py文件,pycharm安
|
4天前
|
Python
|
4天前
|
API Python
Python学习日记(二:函数和逻辑操作)
Python中的函数和逻辑操作至关重要。函数包括可变和不可变参数。
|
4天前
|
缓存 测试技术 Python
python的装饰器是什么?有什么作用?迭代器和生成器的区别?
python的装饰器是什么?有什么作用?迭代器和生成器的区别?
|
4天前
|
Python
惊呆了!Python 闭包与装饰器:解锁代码魔法的神秘钥匙🔑
【7月更文挑战第3天】Python中的闭包和装饰器是代码的神器。闭包是内嵌函数记住外部函数的变量,如`inner_function`记住`outer_function`的`x`。装饰器不修改原函数,增加额外功能,如`my_decorator`在`my_function`执行前后的打印。它们提升代码复用性,如`timeit_decorator`计时或`permission_required`控制访问权限。利用这些特性,编码变得更高效和优雅。
|
9天前
|
机器学习/深度学习 人工智能 程序员
探索Python宝库:从基础到技能的干货知识(数据类型与变量+ 条件与循环+函数与模块+文件+异常+OOP)
探索Python宝库:从基础到技能的干货知识(数据类型与变量+ 条件与循环+函数与模块+文件+异常+OOP)
7 0
|
2月前
|
算法 Python 容器
Python编程 - 不调用相关choose库函数,“众数“挑选器、随机挑选器 的源码编程实现
Python编程 - 不调用相关choose库函数,“众数“挑选器、随机挑选器 的源码编程实现
50 0