python基础学习—装饰器

本文详细介绍了Python装饰器的概念、基本使用方法,包括如何通过装饰器在不改变原函数功能的基础上添加额外功能,以及如何使用`functools.wraps`保持原函数名称。最后展示了简便调用装饰器的例子。
摘要由CSDN通过智能技术生成

1、装饰器

  • Python装饰器(Decorator)是一个修改其他函数或类的行为的函数。它接受一个函数作为参数,并返回一个新的函数。装饰器本质上是一个函数,它让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。

2、实现

2.1、简单理解

  • 本质上讲,装饰器就是通过将原来函数作为参数进行传递,不改变原有功能的情况下,增加了一些新功能。
def square(x):
    return x*x

def print_running(f, x):
    print(f'{f.__name__} 被调用')
    return f(x)

result = print_running(square, 2)
result

在这里插入图片描述

2.2、进阶

  • 将上述print_running做更改,将原函数打包。
def square(x):
    return x*x

def print_running(func):
    # 将传入的函数打包,增加被调用的打印信息
    def wrapper(*args, **kwargs):
        print(f'{func.__name__} 被调用')
        return func(*args, **kwargs)
    return wrapper

square_d = print_running(square)
square_d(2)

2.3、最终

import time

def decorate(func):
    # 将传入的函数打包,增加被调用的打印信息
    def wrapper(*args, **kwargs):
        print(f'{func.__name__} 被调用')
        start_time = time.time()
        time.sleep(0.1)
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f'{func.__name__} 运行时间:{end_time - start_time} 秒')
        return result
    return wrapper

# @decorate
def square(x):
    return x*x

square_ = decorate(square)
print('函数名:',square_.__name__)

square_(2)

在这里插入图片描述

  • 在这里,发现使用装饰器打包函数之后,函数名称变成了wrapper,需要改变代码,让它继承原有的名称。增加@functools.wraps(func)行
import time
import functools

def decorate(func):
    # 将传入的函数打包,增加被调用的打印信息
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print(f'{func.__name__} 被调用')
        start_time = time.time()
        time.sleep(0.1)
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f'{func.__name__} 运行时间:{end_time - start_time} 秒')
        return result
    return wrapper

# @decorate
def square(x):
    return x*x

square_ = decorate(square)
print('函数名:',square_.__name__)

square_(2)

2.4、简便调用

import time
import functools

def decorate(func):
    # 将传入的函数打包,增加被调用的打印信息
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print(f'{func.__name__} 被调用')
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f'{func.__name__} 运行时间:{end_time - start_time} 秒')
        return result
    return wrapper

@decorate
def square(x):
    return x*x


square(2)
  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值