首页 > 编程语言 >Python 装饰器

Python 装饰器

时间:2023-07-29 10:35:42浏览次数:37  
标签:函数 Python wrapper timer time 装饰 decorator

当我们谈到Python中的装饰器时,我们实际上是在谈论一种特殊的语法构造,它允许我们在不修改原始函数代码的情况下,向函数添加额外的功能或行为。装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数。

装饰器的语法使用@符号,将装饰器函数放置在要装饰的函数的上方。当我们调用被装饰的函数时,实际上是调用了装饰器函数返回的新函数。

下面是一个简单的装饰器示例,它记录了函数的执行时间:

import time

def timer_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        execution_time = end_time - start_time
        print(f"函数 {func.__name__} 的执行时间为:{execution_time} 秒")
        return result
    return wrapper

@timer_decorator
def my_function():
    time.sleep(2)
    print("函数执行完毕")

my_function()

在上面的示例中,timer_decorator是一个装饰器函数,它接受一个函数作为参数,并返回一个新的函数wrapperwrapper函数记录了函数的执行时间,并在函数执行完毕后打印出来。

通过在my_function函数的上方使用@timer_decorator语法,我们将timer_decorator装饰器应用到了my_function函数上。当我们调用my_function时,实际上是调用了timer_decorator返回的wrapper函数,从而实现了记录执行时间的功能。

这只是一个简单的装饰器示例,装饰器还可以用于实现缓存、日志记录、权限验证等各种功能。装饰器提供了一种灵活且优雅的方式来修改函数的行为,同时保持了代码的可读性和可维护性。

当然!这是一个示例,演示了如何使用装饰器来验证用户的身份:

def login_required(func):
    def wrapper(*args, **kwargs):
        if check_user_logged_in():
            return func(*args, **kwargs)
        else:
            print("请先登录!")
    return wrapper

@login_required
def view_profile(username):
    print(f"查看用户 {username} 的个人资料")

view_profile("Alice")

在上面的示例中,login_required是一个装饰器函数,它接受一个函数作为参数,并返回一个新的函数wrapperwrapper函数首先调用check_user_logged_in函数来检查用户是否已登录。如果用户已登录,则调用被装饰的函数func,否则打印一条提示信息。

通过在view_profile函数的上方使用@login_required语法,我们将login_required装饰器应用到了view_profile函数上。当我们调用view_profile函数时,实际上是调用了login_required返回的wrapper函数。如果用户已登录,将会查看用户的个人资料;如果用户未登录,将会收到一条提示信息。

这个例子展示了如何使用装饰器来添加身份验证的功能,通过将验证逻辑与原始函数分离,我们可以在多个函数中重复使用这个装饰器,提高了代码的可重用性和可维护性。


标签:函数,Python,wrapper,timer,time,装饰,decorator
From: https://blog.51cto.com/u_16055028/6890694

相关文章

  • 什么时候使用魔术方法,什么时候使用元类,什么时候使用描述符,什么时候使用装饰器, 什
    当你需要在类的实例化、属性访问或方法调用等特定时机执行特定的操作时,可以使用魔术方法。例如,假设你正在编写一个表示矩形的类,并希望在创建矩形对象时自动计算其面积。你可以使用__init__魔术方法来初始化矩形的属性,并在其中计算面积。classRectangle:def__init__(self,wi......
  • python学习难点及举例
    在Python的高级学习中,可能会遇到以下几个难点:迭代器和生成器:迭代器和生成器是Python中强大的概念,但在理解和使用它们时可能会有一些困难。迭代器是一种可以遍历数据集合的对象,而生成器是一种特殊的迭代器,可以按需生成值,而不是一次性生成所有值。#迭代器示例my_list=[1,2,3]m......
  • python爬取壁纸图片到本地
    源码#!/usr/bin/pythonimportrandomimportrequestsimportreimporttimefornuminrange(2,212): #url网页地址url="https://pic.netbian.com/new/index_"+str(num)+".html"#需要爬取图片的网页地址page=requests.get(url).text#得到网页源码#......
  • 基于Python实现RLE格式分割标注文件的格式转换
    下面我将详细讲解“基于Python实现RLE格式分割标注文件的格式转换”的完整攻略。一、RLE格式分割标注文件是什么?RLE格式是一种更加高效的图像语义分割数据表示格式,其数据以一串RLE编码的方式进行存储,而不是以像素点的形式存储,有效减少了数据的体积。RLE格式分割标注文件即是使......
  • Python TensorFlow循环神经网络RNN-LSTM神经网络预测股票市场价格时间序列和MSE评估准
    全文下载链接:http://tecdat.cn/?p=26562最近我们被客户要求撰写关于循环神经网络的研究报告,包括一些图形和统计输出。自2000年 1月以来的股票价格数据。我们使用的是Microsoft股票。该项目包括:将时间序列数据转换为分类问题。使用TensorFlow的LSTM模型由MSE衡......
  • 利用pyinstaller发布不依赖python解释器的可执行exe
    现在打包app.py,从Windows命令提示符(cmd)运行:pyinstaller.exe--onefile--windowedapp.py就这么简单。如果打包成功,最终的可执行文件app.exe和任何相关文件将放在dist目录中,如果该目录不存在,将创建该目录。  PyInstallerManualVersionPyInstaller5.1Homepagehttps://pyinstall......
  • Python工程师面试宝典 一线大厂资深面试官亲授
    第01章Python服务端工程师面试指导-课程导学篇第02章面试流程介绍第03章Python语言基础考察点第04章Python算法与数据结构考察点第05章编程范式考察点第06章操作系统考察点第07章网络编程考察点第08章数据库考察点第09章PythonWeb框架考察点第10章系统设计考察点第11章......
  • Python-3-Python变量与运算符
    第三章:变量与运算符3-1变量的介绍1.变量只能包含字母、数字、下划线。变量名可以以字母或下划线开头,但绝不是数字开头。2.不能将python关键字作为变量名,常见python关键字有:FalseclassfinallyisreturnTruecontinueforlambdat......
  • Python-2-Python数据类型
    第二章:Python数据类型2-1字符串简单介绍'A'+'B'字符串连接输出'AB';'Hello'*3多次连接3次。'Hello'[0]取第一个字符;'Hello'[1]取第二个字符;'Hello'[-1]取最后一个字符;'Hello'[1:3]从e开始取取2个字符el,1+2=3所以是[1:3];'H......
  • Python-1-Python起步
    1-1选择python的理由相对于其它语言,Python容易上手,语法通俗易懂;复杂的概念已经封装好,不需要考虑内存的释放与申请,其它语言上百行代码解决的问题,Python只需要几十行甚至更短的代码。Python设计哲学:优雅、明确、简单//打印print("HelloWorld");//交换xyx,y=y,x 1-2python......