第23课 python中的装饰器、迭代器与生成器

以下是关于装饰器、迭代器与生成器的详细介绍以及相应案例说明:

一、装饰器

1. 概念

装饰器是Python中一种用于修改或扩展函数、类功能的语法结构,它本质上是一个函数,接收一个函数(或类)作为参数,并返回一个新的函数(或类),新的函数(或类)通常会在原函数(或类)的基础上添加一些额外的功能,比如日志记录、性能测试、权限验证等,且不需要修改原函数(或类)的代码,遵循了“开闭原则”(对扩展开放,对修改关闭)。

2. 语法格式

使用 @ 符号加上装饰器函数名来应用装饰器,例如:

@decorator_function
def my_function():
    pass

等同于:

def my_function():
    pass

my_function = decorator_function(my_function)
3. 案例

案例一:简单的日志记录装饰器

import logging

def log_decorator(func):
    def wrapper(*args, **kwargs):
        logging.info(f"Calling function {
     
     func.__name__}")
        result = func(*args, **kwargs)
        logging.info(f"Function {
     
     func.__name__} completed")
        return result
    return wrapper

@log_decorator
def add_numbers(a, b):
    return a + b

result = add_numbers(3, 5)
print(result)

解释

  • 首先导入了Python的标准日志模块 logging,用于记录函数调用的相关信息。
  • 接着定义了 log_decorator 装饰器函数,它接收一个函数 func 作为参数。在装饰器内部,定义了一个名为 wrapper 的内部函数,这个函数会在原函数被调用时执行。
  • wrapper 函数中,首先使用 logging.info 记录了一条日志信息,表示正在调用的函数名称(通过 func.__name__ 获取函数名),然后调用原函数 func,并传入接收到的所有位置参数 *args 和关键字参数 **kwargs,将原函数的返回结果保存到 result 变量中,接着又记录了一条日志信息表示函数调用完成,最后返回原函数的执行结果 result
  • 之后定义了 add_numbers 函数,用于计算两个数相加,并使用 @log_decorator 语法将 log_decorator 装饰器应用到 add_numbers 函数上。这样,当调用 add_numbers 函数时,实际上执行的是经过装饰器包装后的 wrapper 函数,会自动记录函数调用前后的日志信息,最后打印出两数相加的结果 8

案例二:权限验证装饰器

def check_permission(role):
    def decorator(func):
        def wrapper(*args, **kwargs):
            if role == "admin":
                return func(*args, **kwargs)
            else:
                raise PermissionError("You don't have permission to access this function.")
        return wrapper
    return decorator

@check_permission("admin")
def delete_data():
    print("Data has been deleted.")

try:
    delete_data()
except PermissionError as e:
    print(e)

解释

  • 首先定义了 check_permission 函数,它接收一个表示角色的参数 role,并返回一个装饰器函数 decorator。这个 check_permission 函数起到了一个参数化装饰器的作用,允许根据不同的角色来设置权限验证逻辑。
  • decorator 函数内部,又定义了 wrapper 函数,它接收原函数的参数 *args**kwargs。在 wrapper 函数中,会判断传入的角色 role 是否为 "admin",如果是,则调用原函数 func 并返回其结果,否则抛出 PermissionError 异常,表示没有权限访问该函数。
  • 接着定义了 delete_data 函数,用于模拟删除数据的操作,并使用 @check_permission("admin") 将装饰器应用到 delete_data 函数上,意味着只有当角色为 "admin" 时才能执行这个函数。
  • 最后通过 try-except 语句块来调用 delete_data 函数,若有权限则正常执行函数并打印出相应提示,若没有权限则捕获 PermissionError 异常并打印出异常信息,体现了装饰器在权限验证方面的应用,通过装饰器可以方便地为不同的函数添加统一的权限验证逻辑,而无需在每个函数内部重复编写验证代码。

案例三:计算函数执行时间的装饰器(性能测试)

import time

def timeit_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Function {
     
     func.__name__} took {
     
     end_time - start_time} seconds to execute.")
        return result
    return wrapper

@timeit_decorator
def slow_function():
    time<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

结伴同行~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值