【Python-装饰器】无参数简易装饰器示例合集

发布时间 2023-09-05 14:40:37作者: 白猫打不过黑猫

无参数装饰器案例

​ 一些简易的不携带参数的装饰器合集,用于学习和巩固装饰器方面的知识,配合vscode的Debug功能或者pythontutor网站的运行流程可视化来查看装饰器的工作原理以及运行时机。

1.计时器装饰器

# 计时器装饰器:用于测量函数执行时间。

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.perf_counter() # perf_counter()返回性能计数器的值(以分秒为单位)
        result = func(*args, **kwargs)
        end_time = time.perf_counter()
        execution_time = end_time-start_time
        print(f"{func.__name__} 执行时间: {execution_time}秒")
        return result
    return  wrapper

@timer
def my_function():
    time.sleep(2)
    
my_function()

2.日志记录装饰器

# 一个简易的日志记录装饰器,用于记录函数执行信息

def log(func):
    def wrapper(*args, **kwargs):
        print(f"调用函数{func.__name__},参数:{args},{kwargs}")
        result=func(*args, **kwargs)
        print(f"函数{func}执行结果:{result}")    
        return result   
    return wrapper

@log
def calculate(x,y):
    return x+y

calculate(6,9)

3.缓存装饰器:用于缓存函数的结果,提高性能。

# 缓存装饰器:用于缓存函数的结果,提高性能。
def chache(func):
    
    cached_result = {} # k=接收的参数,v为保存的值
        
    def wrapper(*args, **kwargs):
        
        #判断传入的参数是否已经计算过,如果计算过,那么直接返回之前保存过的值即可
        if args in cached_result:
            return cached_result[args]
    
        result=func(*args, **kwargs)
        
        # 如果是新计算的值,那么就保存到缓存字典中
        cached_result[args]=result
        return result

    return wrapper

@chache
def fibonacci(n):
    
    if n <=1:
        return  n 
    
    return fibonacci(n-1) + fibonacci(n-2)

fibonacci(10)

4.输入验证装饰器,用于验证函数输入的有效性

# 输入验证装饰器: 用于验证函数输入的有效性
def validate_input(func):
    
    def wrapper(*args, **kwargs):
        
        # *args表示不定数量的位置参数。并将它们作为一个元组传递给函数
        # **kwargs表示不定数量的关键字参数,并将它们作为一个字典传递给函数
        for arg in  args:
            
            if not isinstance(arg,int):
                
                return '输入的参数必须为整数'
            
        return func(*args, **kwargs) # 调用被装饰函数,func指向的是multiply这个函数对象
    
    return  wrapper


@validate_input
def multiply(a,b):
    
    return a*b

multiply=multiply(10,20)
print(multiply) #Outputs 200

multiply_1=multiply(10,'20')
print(multiply) #Outputs 输入的参数必须为整数

5.函数值打印装饰器:可以省略需要打印函数值的print

# 值打印函数:直接调用函数就可以输出函数的值,不需要再使用print打印
def func_value_print(func):
    
    def wrapper(*args, **kwargs):
        print(f'接下来要运行的函数为:{func}')
        result = func(*args, **kwargs)
        
        print(f'该函数的运行的值为:{result}')
    
    return  wrapper

@func_value_print
def calculate(a,b,c,d):
    
    return (a+b)*(c+d)

calculate(1,1,1,1)