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

简介: 探索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 中一种强大的工具,可用于动态修改函数的行为,常用于日志记录、性能监控、权限验证等场景。通过合理使用装饰器,可以提高代码的灵活性、可重用性和可维护性。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
6月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
415 1
|
6月前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
1094 1
|
6月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
343 0
|
6月前
|
测试技术 Python
Python装饰器:为你的代码施展“魔法”
Python装饰器:为你的代码施展“魔法”
356 100
|
7月前
|
设计模式 缓存 监控
Python装饰器:优雅增强函数功能
Python装饰器:优雅增强函数功能
351 101
|
6月前
|
缓存 Python
Python装饰器:为你的代码施展“魔法
Python装饰器:为你的代码施展“魔法
339 88
|
7月前
|
存储 缓存 测试技术
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
435 98
|
7月前
|
缓存 测试技术 Python
解锁Python超能力:深入理解装饰器
解锁Python超能力:深入理解装饰器
176 2
|
Linux Python
【Python】300行代码实现crontab定时器功能 【上】
熟悉Linux的都知道在Linux下有一个crontab的定时任务,可以很方便的进行各种定时、计划任务的执行。有时候写代码也需要用到定时器业务,因此我使用Python实现了一个类似的定时器模块,可以很方便的做定时业务,使用例子如下:
591 0
【Python】300行代码实现crontab定时器功能 【上】
|
Python
使用python实现一个文件搜索功能,类似于Everything功能
一般人日常总是会将一些片段信息记录到文件中,放到电脑硬盘上。等过段时间,可能就不知道放到哪里了,电脑上文件夹太多。 找文件一般都会借助于搜索软件,比如Everything软件就很强大,输入名称,就能全局查找文件;
857 0

推荐镜像

更多